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 "base/command_line.h" | 5 #include "base/command_line.h" |
6 #include "base/time.h" | 6 #include "base/time.h" |
7 #include "chrome/app/chrome_command_ids.h" | 7 #include "chrome/app/chrome_command_ids.h" |
8 #include "chrome/browser/tabs/tab_strip_model.h" | 8 #include "chrome/browser/tabs/tab_strip_model.h" |
9 #include "chrome/browser/ui/browser.h" | 9 #include "chrome/browser/ui/browser.h" |
10 #include "chrome/browser/ui/browser_navigator.h" | 10 #include "chrome/browser/ui/browser_navigator.h" |
11 #include "chrome/browser/ui/constrained_window_tab_helper.h" | 11 #include "chrome/browser/ui/constrained_window_tab_helper.h" |
12 #include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h" | 12 #include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h" |
13 #include "chrome/common/chrome_notification_types.h" | 13 #include "chrome/common/chrome_notification_types.h" |
14 #include "chrome/common/chrome_switches.h" | 14 #include "chrome/common/chrome_switches.h" |
15 #include "chrome/test/base/in_process_browser_test.h" | 15 #include "chrome/test/base/in_process_browser_test.h" |
16 #include "chrome/test/base/ui_test_utils.h" | 16 #include "chrome/test/base/ui_test_utils.h" |
17 #include "content/browser/renderer_host/render_view_host.h" | 17 #include "content/browser/renderer_host/render_view_host.h" |
18 #include "content/browser/tab_contents/interstitial_page.h" | 18 #include "content/browser/tab_contents/interstitial_page.h" |
19 #include "content/public/browser/navigation_controller.h" | 19 #include "content/public/browser/navigation_controller.h" |
20 #include "content/public/browser/navigation_entry.h" | 20 #include "content/public/browser/navigation_entry.h" |
21 #include "content/public/browser/notification_service.h" | 21 #include "content/public/browser/notification_service.h" |
22 #include "content/public/browser/ssl_status.h" | 22 #include "content/public/browser/ssl_status.h" |
23 #include "content/public/browser/web_contents.h" | 23 #include "content/public/browser/web_contents.h" |
24 #include "content/public/common/security_style.h" | 24 #include "content/public/common/security_style.h" |
25 #include "net/base/cert_status_flags.h" | 25 #include "net/base/cert_status_flags.h" |
26 #include "net/test/test_server.h" | 26 #include "net/test/test_server.h" |
27 | 27 |
| 28 using content::NavigationController; |
28 using content::NavigationEntry; | 29 using content::NavigationEntry; |
29 using content::SSLStatus; | 30 using content::SSLStatus; |
30 using content::WebContents; | 31 using content::WebContents; |
31 | 32 |
32 const FilePath::CharType kDocRoot[] = FILE_PATH_LITERAL("chrome/test/data"); | 33 const FilePath::CharType kDocRoot[] = FILE_PATH_LITERAL("chrome/test/data"); |
33 | 34 |
34 class SSLUITest : public InProcessBrowserTest { | 35 class SSLUITest : public InProcessBrowserTest { |
35 typedef net::TestServer::HTTPSOptions HTTPSOptions; | 36 typedef net::TestServer::HTTPSOptions HTTPSOptions; |
36 | 37 |
37 public: | 38 public: |
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
134 L"window.domAutomationController.send(IsContentLoaded());", | 135 L"window.domAutomationController.send(IsContentLoaded());", |
135 &actuallyLoadedContent)); | 136 &actuallyLoadedContent)); |
136 EXPECT_EQ(expectLoaded, actuallyLoadedContent); | 137 EXPECT_EQ(expectLoaded, actuallyLoadedContent); |
137 } | 138 } |
138 | 139 |
139 void ProceedThroughInterstitial(content::WebContents* tab) { | 140 void ProceedThroughInterstitial(content::WebContents* tab) { |
140 InterstitialPage* interstitial_page = tab->GetInterstitialPage(); | 141 InterstitialPage* interstitial_page = tab->GetInterstitialPage(); |
141 ASSERT_TRUE(interstitial_page); | 142 ASSERT_TRUE(interstitial_page); |
142 ui_test_utils::WindowedNotificationObserver observer( | 143 ui_test_utils::WindowedNotificationObserver observer( |
143 content::NOTIFICATION_LOAD_STOP, | 144 content::NOTIFICATION_LOAD_STOP, |
144 content::Source<content::NavigationController>(&tab->GetController())); | 145 content::Source<NavigationController>(&tab->GetController())); |
145 interstitial_page->Proceed(); | 146 interstitial_page->Proceed(); |
146 observer.Wait(); | 147 observer.Wait(); |
147 } | 148 } |
148 | 149 |
149 int GetConstrainedWindowCount() const { | 150 int GetConstrainedWindowCount() const { |
150 return static_cast<int>( | 151 return static_cast<int>( |
151 browser()->GetSelectedTabContentsWrapper()-> | 152 browser()->GetSelectedTabContentsWrapper()-> |
152 constrained_window_tab_helper()->constrained_window_count()); | 153 constrained_window_tab_helper()->constrained_window_count()); |
153 } | 154 } |
154 | 155 |
(...skipping 288 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
443 ASSERT_TRUE(entry1); | 444 ASSERT_TRUE(entry1); |
444 ui_test_utils::NavigateToURL(browser(), | 445 ui_test_utils::NavigateToURL(browser(), |
445 test_server()->GetURL("files/ssl/blank_page.html")); | 446 test_server()->GetURL("files/ssl/blank_page.html")); |
446 NavigationEntry* entry2 = tab->GetController().GetActiveEntry(); | 447 NavigationEntry* entry2 = tab->GetController().GetActiveEntry(); |
447 ASSERT_TRUE(entry2); | 448 ASSERT_TRUE(entry2); |
448 | 449 |
449 // Now go back so that a page is in the forward history. | 450 // Now go back so that a page is in the forward history. |
450 { | 451 { |
451 ui_test_utils::WindowedNotificationObserver observer( | 452 ui_test_utils::WindowedNotificationObserver observer( |
452 content::NOTIFICATION_LOAD_STOP, | 453 content::NOTIFICATION_LOAD_STOP, |
453 content::Source<content::NavigationController>(&tab->GetController())); | 454 content::Source<NavigationController>(&tab->GetController())); |
454 tab->GetController().GoBack(); | 455 tab->GetController().GoBack(); |
455 observer.Wait(); | 456 observer.Wait(); |
456 } | 457 } |
457 ASSERT_TRUE(tab->GetController().CanGoForward()); | 458 ASSERT_TRUE(tab->GetController().CanGoForward()); |
458 NavigationEntry* entry3 = tab->GetController().GetActiveEntry(); | 459 NavigationEntry* entry3 = tab->GetController().GetActiveEntry(); |
459 ASSERT_TRUE(entry1 == entry3); | 460 ASSERT_TRUE(entry1 == entry3); |
460 | 461 |
461 // Now go to a bad HTTPS page that shows an interstitial. | 462 // Now go to a bad HTTPS page that shows an interstitial. |
462 ui_test_utils::NavigateToURL(browser(), | 463 ui_test_utils::NavigateToURL(browser(), |
463 https_server_expired_.GetURL("files/ssl/google.html")); | 464 https_server_expired_.GetURL("files/ssl/google.html")); |
464 CheckAuthenticationBrokenState(tab, net::CERT_STATUS_DATE_INVALID, false, | 465 CheckAuthenticationBrokenState(tab, net::CERT_STATUS_DATE_INVALID, false, |
465 true); // Interstitial showing | 466 true); // Interstitial showing |
466 | 467 |
467 // Simulate user clicking and holding on forward button. | 468 // Simulate user clicking and holding on forward button. |
468 { | 469 { |
469 ui_test_utils::WindowedNotificationObserver observer( | 470 ui_test_utils::WindowedNotificationObserver observer( |
470 content::NOTIFICATION_LOAD_STOP, | 471 content::NOTIFICATION_LOAD_STOP, |
471 content::Source<content::NavigationController>(&tab->GetController())); | 472 content::Source<NavigationController>(&tab->GetController())); |
472 tab->GetController().GoToOffset(1); | 473 tab->GetController().GoToOffset(1); |
473 observer.Wait(); | 474 observer.Wait(); |
474 } | 475 } |
475 | 476 |
476 // We should be showing the second good page. | 477 // We should be showing the second good page. |
477 EXPECT_FALSE(browser()->GetSelectedWebContents()->GetInterstitialPage()); | 478 EXPECT_FALSE(browser()->GetSelectedWebContents()->GetInterstitialPage()); |
478 CheckUnauthenticatedState(tab); | 479 CheckUnauthenticatedState(tab); |
479 EXPECT_FALSE(tab->GetController().CanGoForward()); | 480 EXPECT_FALSE(tab->GetController().CanGoForward()); |
480 NavigationEntry* entry4 = tab->GetController().GetActiveEntry(); | 481 NavigationEntry* entry4 = tab->GetController().GetActiveEntry(); |
481 EXPECT_TRUE(entry2 == entry4); | 482 EXPECT_TRUE(entry2 == entry4); |
(...skipping 563 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1045 ui_test_utils::NavigateToURL(browser(), | 1046 ui_test_utils::NavigateToURL(browser(), |
1046 https_server_.GetURL(top_frame_path)); | 1047 https_server_.GetURL(top_frame_path)); |
1047 | 1048 |
1048 CheckAuthenticatedState(tab, false); | 1049 CheckAuthenticatedState(tab, false); |
1049 | 1050 |
1050 bool success = false; | 1051 bool success = false; |
1051 // Now navigate inside the frame. | 1052 // Now navigate inside the frame. |
1052 { | 1053 { |
1053 ui_test_utils::WindowedNotificationObserver observer( | 1054 ui_test_utils::WindowedNotificationObserver observer( |
1054 content::NOTIFICATION_LOAD_STOP, | 1055 content::NOTIFICATION_LOAD_STOP, |
1055 content::Source<content::NavigationController>(&tab->GetController())); | 1056 content::Source<NavigationController>(&tab->GetController())); |
1056 EXPECT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractBool( | 1057 EXPECT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractBool( |
1057 tab->GetRenderViewHost(), std::wstring(), | 1058 tab->GetRenderViewHost(), std::wstring(), |
1058 L"window.domAutomationController.send(clickLink('goodHTTPSLink'));", | 1059 L"window.domAutomationController.send(clickLink('goodHTTPSLink'));", |
1059 &success)); | 1060 &success)); |
1060 ASSERT_TRUE(success); | 1061 ASSERT_TRUE(success); |
1061 observer.Wait(); | 1062 observer.Wait(); |
1062 } | 1063 } |
1063 | 1064 |
1064 // We should still be fine. | 1065 // We should still be fine. |
1065 CheckAuthenticatedState(tab, false); | 1066 CheckAuthenticatedState(tab, false); |
1066 | 1067 |
1067 // Now let's hit a bad page. | 1068 // Now let's hit a bad page. |
1068 { | 1069 { |
1069 ui_test_utils::WindowedNotificationObserver observer( | 1070 ui_test_utils::WindowedNotificationObserver observer( |
1070 content::NOTIFICATION_LOAD_STOP, | 1071 content::NOTIFICATION_LOAD_STOP, |
1071 content::Source<content::NavigationController>(&tab->GetController())); | 1072 content::Source<NavigationController>(&tab->GetController())); |
1072 EXPECT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractBool( | 1073 EXPECT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractBool( |
1073 tab->GetRenderViewHost(), std::wstring(), | 1074 tab->GetRenderViewHost(), std::wstring(), |
1074 L"window.domAutomationController.send(clickLink('badHTTPSLink'));", | 1075 L"window.domAutomationController.send(clickLink('badHTTPSLink'));", |
1075 &success)); | 1076 &success)); |
1076 ASSERT_TRUE(success); | 1077 ASSERT_TRUE(success); |
1077 observer.Wait(); | 1078 observer.Wait(); |
1078 } | 1079 } |
1079 | 1080 |
1080 // The security style should still be secure. | 1081 // The security style should still be secure. |
1081 CheckAuthenticatedState(tab, false); | 1082 CheckAuthenticatedState(tab, false); |
1082 | 1083 |
1083 // And the frame should be blocked. | 1084 // And the frame should be blocked. |
1084 bool is_content_evil = true; | 1085 bool is_content_evil = true; |
1085 std::wstring content_frame_xpath(L"html/frameset/frame[2]"); | 1086 std::wstring content_frame_xpath(L"html/frameset/frame[2]"); |
1086 std::wstring is_evil_js(L"window.domAutomationController.send(" | 1087 std::wstring is_evil_js(L"window.domAutomationController.send(" |
1087 L"document.getElementById('evilDiv') != null);"); | 1088 L"document.getElementById('evilDiv') != null);"); |
1088 EXPECT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractBool( | 1089 EXPECT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractBool( |
1089 tab->GetRenderViewHost(), content_frame_xpath, is_evil_js, | 1090 tab->GetRenderViewHost(), content_frame_xpath, is_evil_js, |
1090 &is_content_evil)); | 1091 &is_content_evil)); |
1091 EXPECT_FALSE(is_content_evil); | 1092 EXPECT_FALSE(is_content_evil); |
1092 | 1093 |
1093 // Now go back, our state should still be OK. | 1094 // Now go back, our state should still be OK. |
1094 { | 1095 { |
1095 ui_test_utils::WindowedNotificationObserver observer( | 1096 ui_test_utils::WindowedNotificationObserver observer( |
1096 content::NOTIFICATION_LOAD_STOP, | 1097 content::NOTIFICATION_LOAD_STOP, |
1097 content::Source<content::NavigationController>(&tab->GetController())); | 1098 content::Source<NavigationController>(&tab->GetController())); |
1098 tab->GetController().GoBack(); | 1099 tab->GetController().GoBack(); |
1099 observer.Wait(); | 1100 observer.Wait(); |
1100 } | 1101 } |
1101 CheckAuthenticatedState(tab, false); | 1102 CheckAuthenticatedState(tab, false); |
1102 | 1103 |
1103 // Navigate to a page served over HTTP. | 1104 // Navigate to a page served over HTTP. |
1104 { | 1105 { |
1105 ui_test_utils::WindowedNotificationObserver observer( | 1106 ui_test_utils::WindowedNotificationObserver observer( |
1106 content::NOTIFICATION_LOAD_STOP, | 1107 content::NOTIFICATION_LOAD_STOP, |
1107 content::Source<content::NavigationController>(&tab->GetController())); | 1108 content::Source<NavigationController>(&tab->GetController())); |
1108 EXPECT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractBool( | 1109 EXPECT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractBool( |
1109 tab->GetRenderViewHost(), std::wstring(), | 1110 tab->GetRenderViewHost(), std::wstring(), |
1110 L"window.domAutomationController.send(clickLink('HTTPLink'));", | 1111 L"window.domAutomationController.send(clickLink('HTTPLink'));", |
1111 &success)); | 1112 &success)); |
1112 ASSERT_TRUE(success); | 1113 ASSERT_TRUE(success); |
1113 observer.Wait(); | 1114 observer.Wait(); |
1114 } | 1115 } |
1115 | 1116 |
1116 // Our state should be insecure. | 1117 // Our state should be insecure. |
1117 CheckAuthenticatedState(tab, true); | 1118 CheckAuthenticatedState(tab, true); |
1118 | 1119 |
1119 // Go back, our state should be unchanged. | 1120 // Go back, our state should be unchanged. |
1120 { | 1121 { |
1121 ui_test_utils::WindowedNotificationObserver observer( | 1122 ui_test_utils::WindowedNotificationObserver observer( |
1122 content::NOTIFICATION_LOAD_STOP, | 1123 content::NOTIFICATION_LOAD_STOP, |
1123 content::Source<content::NavigationController>(&tab->GetController())); | 1124 content::Source<NavigationController>(&tab->GetController())); |
1124 tab->GetController().GoBack(); | 1125 tab->GetController().GoBack(); |
1125 observer.Wait(); | 1126 observer.Wait(); |
1126 } | 1127 } |
1127 CheckAuthenticatedState(tab, true); | 1128 CheckAuthenticatedState(tab, true); |
1128 } | 1129 } |
1129 | 1130 |
1130 // From a bad HTTPS top frame: | 1131 // From a bad HTTPS top frame: |
1131 // - navigate to an OK HTTPS frame (expected to be still authentication broken). | 1132 // - navigate to an OK HTTPS frame (expected to be still authentication broken). |
1132 // Marked as flaky, see bug 40932. | 1133 // Marked as flaky, see bug 40932. |
1133 IN_PROC_BROWSER_TEST_F(SSLUITest, FLAKY_TestBadFrameNavigation) { | 1134 IN_PROC_BROWSER_TEST_F(SSLUITest, FLAKY_TestBadFrameNavigation) { |
(...skipping 11 matching lines...) Expand all Loading... |
1145 https_server_expired_.GetURL(top_frame_path)); | 1146 https_server_expired_.GetURL(top_frame_path)); |
1146 CheckAuthenticationBrokenState(tab, net::CERT_STATUS_DATE_INVALID, false, | 1147 CheckAuthenticationBrokenState(tab, net::CERT_STATUS_DATE_INVALID, false, |
1147 true); // Interstitial showing | 1148 true); // Interstitial showing |
1148 | 1149 |
1149 ProceedThroughInterstitial(tab); | 1150 ProceedThroughInterstitial(tab); |
1150 | 1151 |
1151 // Navigate to a good frame. | 1152 // Navigate to a good frame. |
1152 bool success = false; | 1153 bool success = false; |
1153 ui_test_utils::WindowedNotificationObserver observer( | 1154 ui_test_utils::WindowedNotificationObserver observer( |
1154 content::NOTIFICATION_LOAD_STOP, | 1155 content::NOTIFICATION_LOAD_STOP, |
1155 content::Source<content::NavigationController>(&tab->GetController())); | 1156 content::Source<NavigationController>(&tab->GetController())); |
1156 EXPECT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractBool( | 1157 EXPECT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractBool( |
1157 tab->GetRenderViewHost(), std::wstring(), | 1158 tab->GetRenderViewHost(), std::wstring(), |
1158 L"window.domAutomationController.send(clickLink('goodHTTPSLink'));", | 1159 L"window.domAutomationController.send(clickLink('goodHTTPSLink'));", |
1159 &success)); | 1160 &success)); |
1160 ASSERT_TRUE(success); | 1161 ASSERT_TRUE(success); |
1161 observer.Wait(); | 1162 observer.Wait(); |
1162 | 1163 |
1163 // We should still be authentication broken. | 1164 // We should still be authentication broken. |
1164 CheckAuthenticationBrokenState(tab, net::CERT_STATUS_DATE_INVALID, false, | 1165 CheckAuthenticationBrokenState(tab, net::CERT_STATUS_DATE_INVALID, false, |
1165 false); | 1166 false); |
(...skipping 16 matching lines...) Expand all Loading... |
1182 WebContents* tab = browser()->GetSelectedWebContents(); | 1183 WebContents* tab = browser()->GetSelectedWebContents(); |
1183 ui_test_utils::NavigateToURL(browser(), | 1184 ui_test_utils::NavigateToURL(browser(), |
1184 test_server()->GetURL(top_frame_path)); | 1185 test_server()->GetURL(top_frame_path)); |
1185 CheckUnauthenticatedState(tab); | 1186 CheckUnauthenticatedState(tab); |
1186 | 1187 |
1187 // Now navigate inside the frame to a secure HTTPS frame. | 1188 // Now navigate inside the frame to a secure HTTPS frame. |
1188 { | 1189 { |
1189 bool success = false; | 1190 bool success = false; |
1190 ui_test_utils::WindowedNotificationObserver observer( | 1191 ui_test_utils::WindowedNotificationObserver observer( |
1191 content::NOTIFICATION_LOAD_STOP, | 1192 content::NOTIFICATION_LOAD_STOP, |
1192 content::Source<content::NavigationController>(&tab->GetController())); | 1193 content::Source<NavigationController>(&tab->GetController())); |
1193 EXPECT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractBool( | 1194 EXPECT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractBool( |
1194 tab->GetRenderViewHost(), std::wstring(), | 1195 tab->GetRenderViewHost(), std::wstring(), |
1195 L"window.domAutomationController.send(clickLink('goodHTTPSLink'));", | 1196 L"window.domAutomationController.send(clickLink('goodHTTPSLink'));", |
1196 &success)); | 1197 &success)); |
1197 ASSERT_TRUE(success); | 1198 ASSERT_TRUE(success); |
1198 observer.Wait(); | 1199 observer.Wait(); |
1199 } | 1200 } |
1200 | 1201 |
1201 // We should still be unauthenticated. | 1202 // We should still be unauthenticated. |
1202 CheckUnauthenticatedState(tab); | 1203 CheckUnauthenticatedState(tab); |
1203 | 1204 |
1204 // Now navigate to a bad HTTPS frame. | 1205 // Now navigate to a bad HTTPS frame. |
1205 { | 1206 { |
1206 bool success = false; | 1207 bool success = false; |
1207 ui_test_utils::WindowedNotificationObserver observer( | 1208 ui_test_utils::WindowedNotificationObserver observer( |
1208 content::NOTIFICATION_LOAD_STOP, | 1209 content::NOTIFICATION_LOAD_STOP, |
1209 content::Source<content::NavigationController>(&tab->GetController())); | 1210 content::Source<NavigationController>(&tab->GetController())); |
1210 EXPECT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractBool( | 1211 EXPECT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractBool( |
1211 tab->GetRenderViewHost(), std::wstring(), | 1212 tab->GetRenderViewHost(), std::wstring(), |
1212 L"window.domAutomationController.send(clickLink('badHTTPSLink'));", | 1213 L"window.domAutomationController.send(clickLink('badHTTPSLink'));", |
1213 &success)); | 1214 &success)); |
1214 ASSERT_TRUE(success); | 1215 ASSERT_TRUE(success); |
1215 observer.Wait(); | 1216 observer.Wait(); |
1216 } | 1217 } |
1217 | 1218 |
1218 // State should not have changed. | 1219 // State should not have changed. |
1219 CheckUnauthenticatedState(tab); | 1220 CheckUnauthenticatedState(tab); |
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1339 | 1340 |
1340 // Visit a page over https that contains a frame with a redirect. | 1341 // Visit a page over https that contains a frame with a redirect. |
1341 | 1342 |
1342 // XMLHttpRequest insecure content in synchronous mode. | 1343 // XMLHttpRequest insecure content in synchronous mode. |
1343 | 1344 |
1344 // XMLHttpRequest insecure content in asynchronous mode. | 1345 // XMLHttpRequest insecure content in asynchronous mode. |
1345 | 1346 |
1346 // XMLHttpRequest over bad ssl in synchronous mode. | 1347 // XMLHttpRequest over bad ssl in synchronous mode. |
1347 | 1348 |
1348 // XMLHttpRequest over OK ssl in synchronous mode. | 1349 // XMLHttpRequest over OK ssl in synchronous mode. |
OLD | NEW |