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 726 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
737 OpenDestURLWithJSImpl("MetaClick()"); | 737 OpenDestURLWithJSImpl("MetaClick()"); |
738 #else | 738 #else |
739 OpenDestURLWithJSImpl("CtrlClick()"); | 739 OpenDestURLWithJSImpl("CtrlClick()"); |
740 #endif | 740 #endif |
741 } | 741 } |
742 | 742 |
743 void OpenDestURLViaWindowOpen() const { | 743 void OpenDestURLViaWindowOpen() const { |
744 OpenDestURLWithJSImpl("WindowOpen()"); | 744 OpenDestURLWithJSImpl("WindowOpen()"); |
745 } | 745 } |
746 | 746 |
747 void RemoveLinkElementsAndNavigate() const { | 747 void RemoveLinkElements() const { |
748 OpenDestURLWithJSImpl("RemoveLinkElementsAndNavigate()"); | 748 chrome::GetActiveWebContents(current_browser())->GetRenderViewHost()-> |
749 ExecuteJavascriptInWebFrame(string16(), | |
750 ASCIIToUTF16("RemoveLinkElements()")); | |
749 } | 751 } |
750 | 752 |
751 void ClickToNextPageAfterPrerender() { | 753 void ClickToNextPageAfterPrerender() { |
752 content::WindowedNotificationObserver new_page_observer( | 754 content::WindowedNotificationObserver new_page_observer( |
753 content::NOTIFICATION_NAV_ENTRY_COMMITTED, | 755 content::NOTIFICATION_NAV_ENTRY_COMMITTED, |
754 content::NotificationService::AllSources()); | 756 content::NotificationService::AllSources()); |
755 RenderViewHost* render_view_host = | 757 RenderViewHost* render_view_host = |
756 chrome::GetActiveWebContents(current_browser())->GetRenderViewHost(); | 758 chrome::GetActiveWebContents(current_browser())->GetRenderViewHost(); |
757 render_view_host->ExecuteJavascriptInWebFrame( | 759 render_view_host->ExecuteJavascriptInWebFrame( |
758 string16(), | 760 string16(), |
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
843 return prerender_manager; | 845 return prerender_manager; |
844 } | 846 } |
845 | 847 |
846 const PrerenderLinkManager* GetPrerenderLinkManager() const { | 848 const PrerenderLinkManager* GetPrerenderLinkManager() const { |
847 PrerenderLinkManager* prerender_link_manager = | 849 PrerenderLinkManager* prerender_link_manager = |
848 PrerenderLinkManagerFactory::GetForProfile( | 850 PrerenderLinkManagerFactory::GetForProfile( |
849 current_browser()->profile()); | 851 current_browser()->profile()); |
850 return prerender_link_manager; | 852 return prerender_link_manager; |
851 } | 853 } |
852 | 854 |
853 // Asserting on this can result in flaky tests. PrerenderHandles are only | 855 bool DidReceivePrerenderStartEventForLinkNumber(int index) const { |
854 // removed from the PrerenderLinkManager when the prerenders are cancelled | 856 bool received_prerender_started; |
855 // from the renderer process, or the channel for the renderer process is | 857 std::wstring expression = base::StringPrintf( |
856 // closed on the IO thread. In the latter case, the code must be careful to | 858 L"window.domAutomationController.send(Boolean(" |
857 // wait for the channel to close, as it is done asynchronously after swapping | 859 L"receivedPrerenderStartEvents[%d]))", index); |
858 // out the old process. See ChannelDestructionWatcher. | 860 |
861 CHECK(content::ExecuteJavaScriptAndExtractBool( | |
862 chrome::GetActiveWebContents(current_browser())->GetRenderViewHost(), | |
863 L"", expression, | |
864 &received_prerender_started)); | |
865 return received_prerender_started; | |
866 } | |
867 | |
868 bool DidReceivePrerenderStopEventForLinkNumber(int index) const { | |
869 bool received_prerender_stopped; | |
870 std::wstring expression = base::StringPrintf( | |
871 L"window.domAutomationController.send(Boolean(" | |
872 L"receivedPrerenderStopEvents[%d]))", index); | |
873 | |
874 CHECK(content::ExecuteJavaScriptAndExtractBool( | |
875 chrome::GetActiveWebContents(current_browser())->GetRenderViewHost(), | |
876 L"", expression, | |
877 &received_prerender_stopped)); | |
878 return received_prerender_stopped; | |
879 } | |
880 | |
881 // Asserting on this can result in flaky tests. PrerenderHandles are | |
882 // removed from the PrerenderLinkManager when the prerender is canceled from | |
883 // the browser, when the prerenders are cancelled from the renderer process, | |
884 // or the channel for the renderer process is closed on the IO thread. In the | |
885 // last case, the code must be careful to wait for the channel to close, as it | |
886 // is done asynchronously after swapping out the old process. See | |
887 // ChannelDestructionWatcher. | |
859 bool IsEmptyPrerenderLinkManager() const { | 888 bool IsEmptyPrerenderLinkManager() const { |
860 return GetPrerenderLinkManager()->IsEmpty(); | 889 return GetPrerenderLinkManager()->IsEmpty(); |
861 } | 890 } |
862 | 891 |
863 // Returns length of |prerender_manager_|'s history, or -1 on failure. | 892 // Returns length of |prerender_manager_|'s history, or -1 on failure. |
864 int GetHistoryLength() const { | 893 int GetHistoryLength() const { |
865 scoped_ptr<DictionaryValue> prerender_dict( | 894 scoped_ptr<DictionaryValue> prerender_dict( |
866 static_cast<DictionaryValue*>(GetPrerenderManager()->GetAsValue())); | 895 static_cast<DictionaryValue*>(GetPrerenderManager()->GetAsValue())); |
867 if (!prerender_dict.get()) | 896 if (!prerender_dict.get()) |
868 return -1; | 897 return -1; |
869 ListValue* history_list; | 898 ListValue* history_list; |
870 if (!prerender_dict->GetList("history", &history_list)) | 899 if (!prerender_dict->GetList("history", &history_list)) |
871 return -1; | 900 return -1; |
872 return static_cast<int>(history_list->GetSize()); | 901 return static_cast<int>(history_list->GetSize()); |
873 } | 902 } |
874 | 903 |
875 #if defined(FULL_SAFE_BROWSING) | 904 #if defined(FULL_SAFE_BROWSING) |
876 FakeSafeBrowsingDatabaseManager* GetFakeSafeBrowsingDatabaseManager() { | 905 FakeSafeBrowsingDatabaseManager* GetFakeSafeBrowsingDatabaseManager() { |
877 return safe_browsing_factory_->most_recent_service()-> | 906 return safe_browsing_factory_->most_recent_service()-> |
878 fake_database_manager(); | 907 fake_database_manager(); |
879 } | 908 } |
880 #endif | 909 #endif |
881 | 910 |
882 TestPrerenderContents* GetPrerenderContents() const { | 911 TestPrerenderContents* GetPrerenderContentsFor(const GURL& url) const { |
883 PrerenderManager::PrerenderData* prerender_data = | 912 PrerenderManager::PrerenderData* prerender_data = |
884 GetPrerenderManager()->FindPrerenderData( | 913 GetPrerenderManager()->FindPrerenderData( |
885 dest_url_, GetSessionStorageNamespace()); | 914 url, GetSessionStorageNamespace()); |
886 return static_cast<TestPrerenderContents*>( | 915 return static_cast<TestPrerenderContents*>( |
887 prerender_data ? prerender_data->contents() : NULL); | 916 prerender_data ? prerender_data->contents() : NULL); |
888 } | 917 } |
889 | 918 |
919 TestPrerenderContents* GetPrerenderContents() const { | |
920 return GetPrerenderContentsFor(dest_url_); | |
921 } | |
922 | |
890 void set_loader_path(const std::string& path) { | 923 void set_loader_path(const std::string& path) { |
891 loader_path_ = path; | 924 loader_path_ = path; |
892 } | 925 } |
893 | 926 |
894 void set_loader_query_and_fragment(const std::string& query_and_fragment) { | 927 void set_loader_query_and_fragment(const std::string& query_and_fragment) { |
895 loader_query_and_fragment_ = query_and_fragment; | 928 loader_query_and_fragment_ = query_and_fragment; |
896 } | 929 } |
897 | 930 |
898 GURL GetCrossDomainTestUrl(const std::string& path) { | 931 GURL GetCrossDomainTestUrl(const std::string& path) { |
899 static const std::string secondary_domain = "www.foo.com"; | 932 static const std::string secondary_domain = "www.foo.com"; |
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
987 false)); | 1020 false)); |
988 | 1021 |
989 content::RunMessageLoop(); | 1022 content::RunMessageLoop(); |
990 // Now that we've run the prerender until it stopped loading, we can now | 1023 // Now that we've run the prerender until it stopped loading, we can now |
991 // also make sure the launcher has finished loading. | 1024 // also make sure the launcher has finished loading. |
992 loader_nav_observer.Wait(); | 1025 loader_nav_observer.Wait(); |
993 | 1026 |
994 TestPrerenderContents* prerender_contents = GetPrerenderContents(); | 1027 TestPrerenderContents* prerender_contents = GetPrerenderContents(); |
995 | 1028 |
996 if (ShouldRenderPrerenderedPageCorrectly(expected_final_status)) { | 1029 if (ShouldRenderPrerenderedPageCorrectly(expected_final_status)) { |
997 ASSERT_TRUE(prerender_contents != NULL); | 1030 ASSERT_NE(static_cast<PrerenderContents*>(NULL), prerender_contents); |
998 EXPECT_EQ(FINAL_STATUS_MAX, prerender_contents->final_status()); | 1031 EXPECT_EQ(FINAL_STATUS_MAX, prerender_contents->final_status()); |
999 | 1032 |
1000 if (call_javascript_ && expected_number_of_loads > 0) { | 1033 if (call_javascript_ && expected_number_of_loads > 0) { |
1001 // Wait for the prerendered page to change title to signal it is ready | 1034 // Wait for the prerendered page to change title to signal it is ready |
1002 // if required. | 1035 // if required. |
1003 prerender_contents->WaitForPrerenderToHaveReadyTitleIfRequired(); | 1036 prerender_contents->WaitForPrerenderToHaveReadyTitleIfRequired(); |
1004 | 1037 |
1005 // Check if page behaves as expected while in prerendered state. | 1038 // Check if page behaves as expected while in prerendered state. |
1006 bool prerender_test_result = false; | 1039 bool prerender_test_result = false; |
1007 ASSERT_TRUE(content::ExecuteJavaScriptAndExtractBool( | 1040 ASSERT_TRUE(content::ExecuteJavaScriptAndExtractBool( |
1008 prerender_contents->GetRenderViewHostMutable(), L"", | 1041 prerender_contents->GetRenderViewHostMutable(), L"", |
1009 L"window.domAutomationController.send(DidPrerenderPass())", | 1042 L"window.domAutomationController.send(DidPrerenderPass())", |
1010 &prerender_test_result)); | 1043 &prerender_test_result)); |
1011 EXPECT_TRUE(prerender_test_result); | 1044 EXPECT_TRUE(prerender_test_result); |
1012 } | 1045 } |
1013 } else { | 1046 } else { |
1014 // In the failure case, we should have removed |dest_url_| from the | 1047 // In the failure case, we should have removed |dest_url_| from the |
1015 // prerender_manager. We ignore dummy PrerenderContents (as indicated | 1048 // prerender_manager. We ignore dummy PrerenderContents (as indicated |
1016 // by not having started), and PrerenderContents that are expected to | 1049 // by not having started), and PrerenderContents that are expected to |
1017 // be left in the manager until the test finishes. | 1050 // be left in the manager until the test finishes. |
1018 EXPECT_TRUE(prerender_contents == NULL || | 1051 EXPECT_TRUE(prerender_contents == NULL || |
1019 !prerender_contents->prerendering_has_started()); | 1052 !prerender_contents->prerendering_has_started()); |
1020 } | 1053 } |
1021 } | 1054 } |
1022 | 1055 |
1023 void NavigateToURLImpl(const GURL& dest_url, | 1056 void NavigateToURLImpl(const GURL& dest_url, |
1024 WindowOpenDisposition disposition) const { | 1057 WindowOpenDisposition disposition) const { |
1025 ASSERT_TRUE(GetPrerenderManager() != NULL); | 1058 ASSERT_NE(static_cast<PrerenderManager*>(NULL), GetPrerenderManager()); |
1026 // Make sure in navigating we have a URL to use in the PrerenderManager. | 1059 // Make sure in navigating we have a URL to use in the PrerenderManager. |
1027 ASSERT_TRUE(GetPrerenderContents() != NULL); | 1060 ASSERT_NE(static_cast<PrerenderContents*>(NULL), GetPrerenderContents()); |
1028 | 1061 |
1029 // If opening the page in a background tab, it won't be shown when swapped | 1062 // If opening the page in a background tab, it won't be shown when swapped |
1030 // in. | 1063 // in. |
1031 if (disposition == NEW_BACKGROUND_TAB) | 1064 if (disposition == NEW_BACKGROUND_TAB) |
1032 GetPrerenderContents()->set_should_be_shown(false); | 1065 GetPrerenderContents()->set_should_be_shown(false); |
1033 | 1066 |
1034 scoped_ptr<content::WindowedNotificationObserver> page_load_observer; | 1067 scoped_ptr<content::WindowedNotificationObserver> page_load_observer; |
1035 WebContents* web_contents = NULL; | 1068 WebContents* web_contents = NULL; |
1036 | 1069 |
1037 if (GetPrerenderContents()->prerender_contents()) { | 1070 if (GetPrerenderContents()->prerender_contents()) { |
(...skipping 10 matching lines...) Expand all Loading... | |
1048 } | 1081 } |
1049 | 1082 |
1050 // Navigate to the prerendered URL, but don't run the message loop. Browser | 1083 // Navigate to the prerendered URL, but don't run the message loop. Browser |
1051 // issued navigations to prerendered pages will synchronously swap in the | 1084 // issued navigations to prerendered pages will synchronously swap in the |
1052 // prerendered page. | 1085 // prerendered page. |
1053 ui_test_utils::NavigateToURLWithDisposition( | 1086 ui_test_utils::NavigateToURLWithDisposition( |
1054 current_browser(), dest_url, disposition, | 1087 current_browser(), dest_url, disposition, |
1055 ui_test_utils::BROWSER_TEST_NONE); | 1088 ui_test_utils::BROWSER_TEST_NONE); |
1056 | 1089 |
1057 // Make sure the PrerenderContents found earlier was used or removed. | 1090 // Make sure the PrerenderContents found earlier was used or removed. |
1058 EXPECT_TRUE(GetPrerenderContents() == NULL); | 1091 EXPECT_EQ(static_cast<PrerenderContents*>(NULL), GetPrerenderContents()); |
1059 | 1092 |
1060 if (call_javascript_ && web_contents) { | 1093 if (call_javascript_ && web_contents) { |
1061 if (page_load_observer.get()) | 1094 if (page_load_observer.get()) |
1062 page_load_observer->Wait(); | 1095 page_load_observer->Wait(); |
1063 | 1096 |
1064 bool display_test_result = false; | 1097 bool display_test_result = false; |
1065 ASSERT_TRUE(content::ExecuteJavaScriptAndExtractBool( | 1098 ASSERT_TRUE(content::ExecuteJavaScriptAndExtractBool( |
1066 web_contents->GetRenderViewHost(), L"", | 1099 web_contents->GetRenderViewHost(), L"", |
1067 L"window.domAutomationController.send(DidDisplayPass())", | 1100 L"window.domAutomationController.send(DidDisplayPass())", |
1068 &display_test_result)); | 1101 &display_test_result)); |
1069 EXPECT_TRUE(display_test_result); | 1102 EXPECT_TRUE(display_test_result); |
1070 } | 1103 } |
1071 } | 1104 } |
1072 | 1105 |
1073 // Opens the prerendered page using javascript functions in the | 1106 // Opens the prerendered page using javascript functions in the |
1074 // loader page. |javascript_function_name| should be a 0 argument function | 1107 // loader page. |javascript_function_name| should be a 0 argument function |
1075 // which is invoked. | 1108 // which is invoked. |
1076 void OpenDestURLWithJSImpl(const std::string& javascript_function_name) | 1109 void OpenDestURLWithJSImpl(const std::string& javascript_function_name) |
1077 const { | 1110 const { |
1078 TestPrerenderContents* prerender_contents = GetPrerenderContents(); | 1111 TestPrerenderContents* prerender_contents = GetPrerenderContents(); |
1079 ASSERT_TRUE(prerender_contents != NULL); | 1112 ASSERT_NE(static_cast<PrerenderContents*>(NULL), prerender_contents); |
1080 | 1113 |
1081 RenderViewHost* render_view_host = | 1114 RenderViewHost* render_view_host = |
1082 chrome::GetActiveWebContents(current_browser())->GetRenderViewHost(); | 1115 chrome::GetActiveWebContents(current_browser())->GetRenderViewHost(); |
1083 | 1116 |
1084 render_view_host->ExecuteJavascriptInWebFrame( | 1117 render_view_host->ExecuteJavascriptInWebFrame( |
1085 string16(), ASCIIToUTF16(javascript_function_name)); | 1118 string16(), ASCIIToUTF16(javascript_function_name)); |
1086 | 1119 |
1087 if (prerender_contents->quit_message_loop_on_destruction()) { | 1120 if (prerender_contents->quit_message_loop_on_destruction()) { |
1088 // Run message loop until the prerender contents is destroyed. | 1121 // Run message loop until the prerender contents is destroyed. |
1089 content::RunMessageLoop(); | 1122 content::RunMessageLoop(); |
1090 } else { | 1123 } else { |
1091 // We don't expect to pick up a running prerender, so instead | 1124 // We don't expect to pick up a running prerender, so instead |
1092 // observe one navigation. | 1125 // observe one navigation. |
1093 content::TestNavigationObserver observer( | 1126 content::TestNavigationObserver observer( |
1094 content::NotificationService::AllSources(), NULL, 1); | 1127 content::NotificationService::AllSources(), NULL, 1); |
1095 base::RunLoop run_loop; | 1128 base::RunLoop run_loop; |
1096 observer.WaitForObservation( | 1129 observer.WaitForObservation( |
1097 base::Bind(&content::RunThisRunLoop, | 1130 base::Bind(&content::RunThisRunLoop, |
1098 base::Unretained(&run_loop)), | 1131 base::Unretained(&run_loop)), |
1099 content::GetQuitTaskForRunLoop(&run_loop)); | 1132 content::GetQuitTaskForRunLoop(&run_loop)); |
(...skipping 20 matching lines...) Expand all Loading... | |
1120 | 1153 |
1121 ChannelDestructionWatcher channel_close_watcher; | 1154 ChannelDestructionWatcher channel_close_watcher; |
1122 channel_close_watcher.WatchChannel( | 1155 channel_close_watcher.WatchChannel( |
1123 chrome::GetActiveWebContents(browser())->GetRenderProcessHost()); | 1156 chrome::GetActiveWebContents(browser())->GetRenderProcessHost()); |
1124 NavigateToDestURL(); | 1157 NavigateToDestURL(); |
1125 channel_close_watcher.WaitForChannelClose(); | 1158 channel_close_watcher.WaitForChannelClose(); |
1126 | 1159 |
1127 ASSERT_TRUE(IsEmptyPrerenderLinkManager()); | 1160 ASSERT_TRUE(IsEmptyPrerenderLinkManager()); |
1128 } | 1161 } |
1129 | 1162 |
1163 // Checks that pending prerenders launch and receive proper event treatment. | |
1164 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPagePending) { | |
1165 std::deque<FinalStatus> expected_final_status_queue; | |
1166 expected_final_status_queue.push_back(FINAL_STATUS_USED); | |
1167 expected_final_status_queue.push_back(FINAL_STATUS_USED); | |
1168 PrerenderTestURL("files/prerender/prerender_page_pending.html", | |
1169 expected_final_status_queue, 1); | |
1170 | |
1171 ChannelDestructionWatcher first_channel_close_watcher; | |
1172 | |
1173 first_channel_close_watcher.WatchChannel( | |
1174 chrome::GetActiveWebContents(browser())->GetRenderProcessHost()); | |
1175 NavigateToDestURL(); | |
1176 // NavigateToDestURL doesn't run a message loop. Normally that's fine, but in | |
1177 // this case, we need the pending prerenders to start. | |
1178 content::RunMessageLoop(); | |
1179 first_channel_close_watcher.WaitForChannelClose(); | |
1180 | |
1181 EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(1)); | |
1182 EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(1)); | |
1183 | |
1184 const GURL prerender_page_url = | |
1185 test_server()->GetURL("files/prerender/prerender_page.html"); | |
1186 EXPECT_FALSE(IsEmptyPrerenderLinkManager()); | |
1187 EXPECT_NE(static_cast<TestPrerenderContents*>(NULL), | |
1188 GetPrerenderContentsFor(prerender_page_url)); | |
1189 | |
1190 // Now navigate to our target page. | |
1191 ChannelDestructionWatcher second_channel_close_watcher; | |
1192 second_channel_close_watcher.WatchChannel( | |
1193 chrome::GetActiveWebContents(browser())->GetRenderProcessHost()); | |
1194 ui_test_utils::NavigateToURLWithDisposition( | |
1195 current_browser(), prerender_page_url, CURRENT_TAB, | |
1196 ui_test_utils::BROWSER_TEST_NONE); | |
1197 second_channel_close_watcher.WaitForChannelClose(); | |
1198 | |
1199 EXPECT_TRUE(IsEmptyPrerenderLinkManager()); | |
1200 } | |
1201 | |
1202 // Checks that pending prerenders which are canceled before they are launched | |
1203 // never get started. | |
1204 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPageRemovesPending) { | |
1205 PrerenderTestURL("files/prerender/prerender_page_removes_pending.html", | |
1206 FINAL_STATUS_USED, 1); | |
1207 | |
1208 ChannelDestructionWatcher channel_close_watcher; | |
1209 channel_close_watcher.WatchChannel( | |
1210 chrome::GetActiveWebContents(browser())->GetRenderProcessHost()); | |
1211 NavigateToDestURL(); | |
1212 channel_close_watcher.WaitForChannelClose(); | |
1213 | |
1214 EXPECT_FALSE(DidReceivePrerenderStartEventForLinkNumber(1)); | |
1215 EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(1)); | |
1216 | |
1217 ASSERT_TRUE(IsEmptyPrerenderLinkManager()); | |
1218 } | |
1219 | |
1130 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPageRemovingLink) { | 1220 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPageRemovingLink) { |
1131 set_loader_path("files/prerender/prerender_loader_removing_links.html"); | 1221 set_loader_path("files/prerender/prerender_loader_removing_links.html"); |
1132 set_loader_query_and_fragment("?links_to_insert=1&links_to_remove=1"); | 1222 set_loader_query_and_fragment("?links_to_insert=1&links_to_remove=1"); |
1133 PrerenderTestURL("files/prerender/prerender_page.html", | 1223 PrerenderTestURL("files/prerender/prerender_page.html", |
1134 FINAL_STATUS_CANCELLED, 1); | 1224 FINAL_STATUS_CANCELLED, 1); |
1225 EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(1)); | |
1226 EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(1)); | |
1227 | |
1135 // No ChannelDestructionWatcher is needed here, since prerenders in the | 1228 // No ChannelDestructionWatcher is needed here, since prerenders in the |
1136 // PrerenderLinkManager should be deleted by removing the links, rather than | 1229 // PrerenderLinkManager should be deleted by removing the links, rather than |
1137 // shutting down the renderer process. | 1230 // shutting down the renderer process. |
1138 RemoveLinkElementsAndNavigate(); | 1231 RemoveLinkElements(); |
1139 ASSERT_TRUE(IsEmptyPrerenderLinkManager()); | 1232 EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(1)); |
1233 EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(1)); | |
1234 EXPECT_TRUE(IsEmptyPrerenderLinkManager()); | |
mmenke
2012/12/17 17:08:18
Forgot how ugly this was. Think it's worth noting
gavinp
2012/12/17 20:34:02
Done.
| |
1140 } | 1235 } |
1141 | 1236 |
1142 IN_PROC_BROWSER_TEST_F( | 1237 IN_PROC_BROWSER_TEST_F( |
1143 PrerenderBrowserTest, PrerenderPageRemovingLinkWithTwoLinks) { | 1238 PrerenderBrowserTest, PrerenderPageRemovingLinkWithTwoLinks) { |
1144 set_loader_path("files/prerender/prerender_loader_removing_links.html"); | 1239 set_loader_path("files/prerender/prerender_loader_removing_links.html"); |
1145 set_loader_query_and_fragment("?links_to_insert=2&links_to_remove=2"); | 1240 set_loader_query_and_fragment("?links_to_insert=2&links_to_remove=2"); |
1146 PrerenderTestURL("files/prerender/prerender_page.html", | 1241 PrerenderTestURL("files/prerender/prerender_page.html", |
1147 FINAL_STATUS_CANCELLED, 1); | 1242 FINAL_STATUS_CANCELLED, 1); |
1148 RemoveLinkElementsAndNavigate(); | 1243 EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(1)); |
1149 ASSERT_TRUE(IsEmptyPrerenderLinkManager()); | 1244 EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(1)); |
1245 EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(2)); | |
1246 EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(2)); | |
1247 | |
1248 RemoveLinkElements(); | |
1249 EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(1)); | |
1250 EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(1)); | |
1251 EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(2)); | |
1252 | |
mmenke
2012/12/17 17:08:18
nit: Weird space for space.
gavinp
2012/12/17 20:34:02
Done.
| |
1253 EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(2)); | |
1254 EXPECT_TRUE(IsEmptyPrerenderLinkManager()); | |
1150 } | 1255 } |
1151 | 1256 |
1152 #if defined(OS_WIN) | 1257 #if defined(OS_WIN) |
1153 // TODO(gavinp): Fails on XP Rel - http://crbug.com/128841 | 1258 // TODO(gavinp): Fails on XP Rel - http://crbug.com/128841 |
1154 #define MAYBE_PrerenderPageRemovingLinkWithTwoLinksRemovingOne \ | 1259 #define MAYBE_PrerenderPageRemovingLinkWithTwoLinksRemovingOne \ |
1155 DISABLED_PrerenderPageRemovingLinkWithTwoLinksRemovingOne | 1260 DISABLED_PrerenderPageRemovingLinkWithTwoLinksRemovingOne |
1156 #else | 1261 #else |
1157 #define MAYBE_PrerenderPageRemovingLinkWithTwoLinksRemovingOne \ | 1262 #define MAYBE_PrerenderPageRemovingLinkWithTwoLinksRemovingOne \ |
1158 PrerenderPageRemovingLinkWithTwoLinksRemovingOne | 1263 PrerenderPageRemovingLinkWithTwoLinksRemovingOne |
1159 #endif // defined(OS_WIN) | 1264 #endif // defined(OS_WIN) |
1160 IN_PROC_BROWSER_TEST_F( | 1265 IN_PROC_BROWSER_TEST_F( |
1161 PrerenderBrowserTest, | 1266 PrerenderBrowserTest, |
1162 MAYBE_PrerenderPageRemovingLinkWithTwoLinksRemovingOne) { | 1267 MAYBE_PrerenderPageRemovingLinkWithTwoLinksRemovingOne) { |
1163 set_loader_path("files/prerender/prerender_loader_removing_links.html"); | 1268 set_loader_path("files/prerender/prerender_loader_removing_links.html"); |
1164 set_loader_query_and_fragment("?links_to_insert=2&links_to_remove=1"); | 1269 set_loader_query_and_fragment("?links_to_insert=2&links_to_remove=1"); |
1165 PrerenderTestURL("files/prerender/prerender_page.html", | 1270 PrerenderTestURL("files/prerender/prerender_page.html", |
1166 FINAL_STATUS_USED, 1); | 1271 FINAL_STATUS_USED, 1); |
1167 RemoveLinkElementsAndNavigate(); | 1272 EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(1)); |
1168 } | 1273 EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(1)); |
1274 EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(2)); | |
1275 EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(2)); | |
1169 | 1276 |
1170 IN_PROC_BROWSER_TEST_F( | 1277 RemoveLinkElements(); |
1171 PrerenderBrowserTest, PrerenderPageRemovingLinkWithOneLinkRemovingTwo) { | 1278 EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(1)); |
1172 set_loader_path("files/prerender/prerender_loader_removing_links.html"); | 1279 EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(1)); |
1173 set_loader_query_and_fragment("?links_to_insert=1&links_to_remove=2"); | 1280 EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(2)); |
1174 PrerenderTestURL("files/prerender/prerender_page.html", | 1281 EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(2)); |
1175 FINAL_STATUS_CANCELLED, 1); | 1282 |
1176 RemoveLinkElementsAndNavigate(); | 1283 EXPECT_FALSE(IsEmptyPrerenderLinkManager()); |
1284 | |
1285 ChannelDestructionWatcher channel_close_watcher; | |
1286 channel_close_watcher.WatchChannel( | |
1287 chrome::GetActiveWebContents(browser())->GetRenderProcessHost()); | |
1288 NavigateToDestURL(); | |
1289 channel_close_watcher.WaitForChannelClose(); | |
1290 | |
1291 EXPECT_TRUE(IsEmptyPrerenderLinkManager()); | |
1177 } | 1292 } |
1178 | 1293 |
1179 // Checks that prerendering works in incognito mode. | 1294 // Checks that prerendering works in incognito mode. |
1180 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderIncognito) { | 1295 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderIncognito) { |
1181 Profile* normal_profile = current_browser()->profile(); | 1296 Profile* normal_profile = current_browser()->profile(); |
1182 set_browser( | 1297 set_browser( |
1183 ui_test_utils::OpenURLOffTheRecord(normal_profile, GURL("about:blank"))); | 1298 ui_test_utils::OpenURLOffTheRecord(normal_profile, GURL("about:blank"))); |
1184 // Increase memory expectations on the incognito PrerenderManager. | 1299 // Increase memory expectations on the incognito PrerenderManager. |
1185 IncreasePrerenderMemory(); | 1300 IncreasePrerenderMemory(); |
1186 PrerenderTestURL("files/prerender/prerender_page.html", FINAL_STATUS_USED, 1); | 1301 PrerenderTestURL("files/prerender/prerender_page.html", FINAL_STATUS_USED, 1); |
(...skipping 1078 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2265 // used to compare with PrerenderClearHistory test. | 2380 // used to compare with PrerenderClearHistory test. |
2266 EXPECT_EQ(1, GetHistoryLength()); | 2381 EXPECT_EQ(1, GetHistoryLength()); |
2267 } | 2382 } |
2268 | 2383 |
2269 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderCancelAll) { | 2384 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderCancelAll) { |
2270 PrerenderTestURL("files/prerender/prerender_page.html", | 2385 PrerenderTestURL("files/prerender/prerender_page.html", |
2271 FINAL_STATUS_CANCELLED, | 2386 FINAL_STATUS_CANCELLED, |
2272 1); | 2387 1); |
2273 // Post a task to cancel all the prerenders. | 2388 // Post a task to cancel all the prerenders. |
2274 MessageLoop::current()->PostTask( | 2389 MessageLoop::current()->PostTask( |
2275 FROM_HERE, | 2390 FROM_HERE, base::Bind(&CancelAllPrerenders, GetPrerenderManager())); |
2276 base::Bind(&CancelAllPrerenders, GetPrerenderManager())); | |
2277 content::RunMessageLoop(); | 2391 content::RunMessageLoop(); |
2278 EXPECT_TRUE(GetPrerenderContents() == NULL); | 2392 EXPECT_TRUE(GetPrerenderContents() == NULL); |
2279 } | 2393 } |
2280 | 2394 |
2395 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderEvents) { | |
2396 PrerenderTestURL("files/prerender/prerender_page.html", | |
2397 FINAL_STATUS_CANCELLED, 1); | |
2398 EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(1)); | |
2399 EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(1)); | |
2400 | |
2401 MessageLoop::current()->PostTask( | |
2402 FROM_HERE, base::Bind(&CancelAllPrerenders, GetPrerenderManager())); | |
2403 content::RunMessageLoop(); | |
2404 | |
2405 EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(1)); | |
2406 EXPECT_TRUE(DidReceivePrerenderStopEventForLinkNumber(1)); | |
2407 } | |
2408 | |
2281 // Prerendering and history tests. | 2409 // Prerendering and history tests. |
2282 // The prerendered page is navigated to in several ways [navigate via | 2410 // The prerendered page is navigated to in several ways [navigate via |
2283 // omnibox, click on link, key-modified click to open in background tab, etc], | 2411 // omnibox, click on link, key-modified click to open in background tab, etc], |
2284 // followed by a navigation to another page from the prerendered page, followed | 2412 // followed by a navigation to another page from the prerendered page, followed |
2285 // by a back navigation. | 2413 // by a back navigation. |
2286 | 2414 |
2287 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderNavigateClickGoBack) { | 2415 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderNavigateClickGoBack) { |
2288 PrerenderTestURL("files/prerender/prerender_page_with_link.html", | 2416 PrerenderTestURL("files/prerender/prerender_page_with_link.html", |
2289 FINAL_STATUS_USED, | 2417 FINAL_STATUS_USED, |
2290 1); | 2418 1); |
(...skipping 216 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2507 channel_close_watcher.WatchChannel( | 2635 channel_close_watcher.WatchChannel( |
2508 chrome::GetActiveWebContents(browser())->GetRenderProcessHost()); | 2636 chrome::GetActiveWebContents(browser())->GetRenderProcessHost()); |
2509 NavigateToDestURL(); | 2637 NavigateToDestURL(); |
2510 channel_close_watcher.WaitForChannelClose(); | 2638 channel_close_watcher.WaitForChannelClose(); |
2511 | 2639 |
2512 ASSERT_TRUE(IsEmptyPrerenderLinkManager()); | 2640 ASSERT_TRUE(IsEmptyPrerenderLinkManager()); |
2513 ASSERT_TRUE(catcher.GetNextResult()) << catcher.message(); | 2641 ASSERT_TRUE(catcher.GetNextResult()) << catcher.message(); |
2514 } | 2642 } |
2515 | 2643 |
2516 } // namespace prerender | 2644 } // namespace prerender |
OLD | NEW |