ssl_browser_tests.cc revision c2e0dbddbe15c98d52c4786dac06cb8952a8ae6d
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/path_service.h"
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/string_util.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/stringprintf.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/time.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/utf_string_conversions.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/app/chrome_command_ids.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/content_settings/host_content_settings_map.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_commands.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_navigator.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_tabstrip.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/tabs/tab_strip_model.h"
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/web_contents_modal_dialog_manager.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_notification_types.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_paths.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_switches.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/in_process_browser_test.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/ui_test_utils.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_context.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/interstitial_page.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/navigation_controller.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/navigation_entry.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h"
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_view_host.h"
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h"
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents_observer.h"
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/security_style.h"
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/ssl_status.h"
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/browser_test_utils.h"
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/download_test_observer.h"
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/test_renderer_host.h"
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "crypto/nss_util.h"
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/crypto_module.h"
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_errors.h"
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/test_data_directory.h"
44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/cert/cert_status_flags.h"
45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/test/spawned_test_server.h"
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_NSS)
48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/cert/nss_cert_database.h"
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // defined(USE_NSS)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::InterstitialPage;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::NavigationController;
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::NavigationEntry;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::SSLStatus;
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebContents;
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const base::FilePath::CharType kDocRoot[] =
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FILE_PATH_LITERAL("chrome/test/data");
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ProvisionalLoadWaiter : public content::WebContentsObserver {
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit ProvisionalLoadWaiter(WebContents* tab)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : WebContentsObserver(tab), waiting_(false), seen_(false) {}
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Wait() {
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (seen_)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    waiting_ = true;
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::RunMessageLoop();
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void DidFailProvisionalLoad(
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int64 frame_id,
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bool is_main_frame,
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const GURL& validated_url,
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int error_code,
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const string16& error_description,
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::RenderViewHost* render_view_host) OVERRIDE {
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    seen_ = true;
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (waiting_)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      MessageLoopForUI::current()->Quit();
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool waiting_;
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool seen_;
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SSLUITest : public InProcessBrowserTest {
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SSLUITest()
97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      : https_server_(net::SpawnedTestServer::TYPE_HTTPS,
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      SSLOptions(SSLOptions::CERT_OK),
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      base::FilePath(kDocRoot)),
100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        https_server_expired_(net::SpawnedTestServer::TYPE_HTTPS,
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              SSLOptions(SSLOptions::CERT_EXPIRED),
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              base::FilePath(kDocRoot)),
103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        https_server_mismatched_(net::SpawnedTestServer::TYPE_HTTPS,
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 SSLOptions(SSLOptions::CERT_MISMATCHED_NAME),
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 base::FilePath(kDocRoot)),
106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        wss_server_expired_(net::SpawnedTestServer::TYPE_WSS,
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            SSLOptions(SSLOptions::CERT_EXPIRED),
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            net::GetWebSocketTestDataDirectory()) {}
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Browser will both run and display insecure content.
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    command_line->AppendSwitch(switches::kAllowRunningInsecureContent);
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Use process-per-site so that navigating to a same-site page in a
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // new tab will use the same process.
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    command_line->AppendSwitch(switches::kProcessPerSite);
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CheckAuthenticatedState(WebContents* tab,
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               bool displayed_insecure_content) {
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_FALSE(tab->IsCrashed());
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NavigationEntry* entry = tab->GetController().GetActiveEntry();
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(entry);
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(content::PAGE_TYPE_NORMAL, entry->GetPageType());
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(content::SECURITY_STYLE_AUTHENTICATED,
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              entry->GetSSL().security_style);
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0U, entry->GetSSL().cert_status & net::CERT_STATUS_ALL_ERRORS);
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(displayed_insecure_content,
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              !!(entry->GetSSL().content_status &
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 SSLStatus::DISPLAYED_INSECURE_CONTENT));
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        !!(entry->GetSSL().content_status & SSLStatus::RAN_INSECURE_CONTENT));
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CheckUnauthenticatedState(WebContents* tab) {
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_FALSE(tab->IsCrashed());
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NavigationEntry* entry = tab->GetController().GetActiveEntry();
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(entry);
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(content::PAGE_TYPE_NORMAL, entry->GetPageType());
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(content::SECURITY_STYLE_UNAUTHENTICATED,
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              entry->GetSSL().security_style);
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0U, entry->GetSSL().cert_status & net::CERT_STATUS_ALL_ERRORS);
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(!!(entry->GetSSL().content_status &
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    SSLStatus::DISPLAYED_INSECURE_CONTENT));
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        !!(entry->GetSSL().content_status & SSLStatus::RAN_INSECURE_CONTENT));
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CheckAuthenticationBrokenState(WebContents* tab,
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      net::CertStatus error,
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      bool ran_insecure_content,
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      bool interstitial) {
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_FALSE(tab->IsCrashed());
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NavigationEntry* entry = tab->GetController().GetActiveEntry();
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(entry);
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(interstitial ?
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  content::PAGE_TYPE_INTERSTITIAL : content::PAGE_TYPE_NORMAL,
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              entry->GetPageType());
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(content::SECURITY_STYLE_AUTHENTICATION_BROKEN,
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              entry->GetSSL().security_style);
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // CERT_STATUS_UNABLE_TO_CHECK_REVOCATION doesn't lower the security style
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // to SECURITY_STYLE_AUTHENTICATION_BROKEN.
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_NE(net::CERT_STATUS_UNABLE_TO_CHECK_REVOCATION, error);
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(error, entry->GetSSL().cert_status & error);
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(!!(entry->GetSSL().content_status &
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    SSLStatus::DISPLAYED_INSECURE_CONTENT));
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ran_insecure_content,
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        !!(entry->GetSSL().content_status & SSLStatus::RAN_INSECURE_CONTENT));
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    net::CertStatus extra_cert_errors = error ^ (entry->GetSSL().cert_status &
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                 net::CERT_STATUS_ALL_ERRORS);
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (extra_cert_errors)
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      LOG(WARNING) << "Got unexpected cert error: " << extra_cert_errors;
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CheckWorkerLoadResult(WebContents* tab, bool expectLoaded) {
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Workers are async and we don't have notifications for them passing
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // messages since they do it between renderer and worker processes.
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // So have a polling loop, check every 200ms, timeout at 30s.
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const int timeout_ms = 200;
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::Time timeToQuit = base::Time::Now() +
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::TimeDelta::FromMilliseconds(30000);
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (base::Time::Now() < timeToQuit) {
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bool workerFinished = false;
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ASSERT_TRUE(content::ExecuteScriptAndExtractBool(
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          tab,
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          "window.domAutomationController.send(IsWorkerFinished());",
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          &workerFinished));
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (workerFinished)
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Wait a bit.
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      MessageLoop::current()->PostDelayedTask(
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          FROM_HERE,
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          MessageLoop::QuitClosure(),
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          base::TimeDelta::FromMilliseconds(timeout_ms));
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::RunMessageLoop();
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool actuallyLoadedContent = false;
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_TRUE(content::ExecuteScriptAndExtractBool(
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        tab,
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "window.domAutomationController.send(IsContentLoaded());",
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        &actuallyLoadedContent));
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(expectLoaded, actuallyLoadedContent);
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ProceedThroughInterstitial(WebContents* tab) {
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    InterstitialPage* interstitial_page = tab->GetInterstitialPage();
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(interstitial_page);
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::WindowedNotificationObserver observer(
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::NOTIFICATION_LOAD_STOP,
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::Source<NavigationController>(&tab->GetController()));
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    interstitial_page->Proceed();
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    observer.Wait();
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool IsShowingWebContentsModalDialog() const {
2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return WebContentsModalDialogManager::FromWebContents(
2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        browser()->tab_strip_model()->GetActiveWebContents())->
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            IsShowingDialog();
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static bool GetFilePathWithHostAndPortReplacement(
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::string& original_file_path,
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const net::HostPortPair& host_port_pair,
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::string* replacement_path) {
228c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    std::vector<net::SpawnedTestServer::StringPair> replacement_text;
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    replacement_text.push_back(
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        make_pair("REPLACE_WITH_HOST_AND_PORT", host_port_pair.ToString()));
231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return net::SpawnedTestServer::GetFilePathWithReplacements(
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        original_file_path, replacement_text, replacement_path);
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  static bool GetTopFramePath(const net::SpawnedTestServer& http_server,
236c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                              const net::SpawnedTestServer& good_https_server,
237c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                              const net::SpawnedTestServer& bad_https_server,
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              std::string* top_frame_path) {
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The "frame_left.html" page contained in the top_frame.html page contains
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // <a href>'s to three different servers. This sets up all of the
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // replacement text to work with test servers which listen on ephemeral
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // ports.
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GURL http_url = http_server.GetURL("files/ssl/google.html");
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GURL good_https_url = good_https_server.GetURL("files/ssl/google.html");
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GURL bad_https_url = bad_https_server.GetURL(
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "files/ssl/bad_iframe.html");
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
248c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    std::vector<net::SpawnedTestServer::StringPair> replacement_text_frame_left;
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    replacement_text_frame_left.push_back(
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        make_pair("REPLACE_WITH_HTTP_PAGE", http_url.spec()));
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    replacement_text_frame_left.push_back(
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        make_pair("REPLACE_WITH_GOOD_HTTPS_PAGE", good_https_url.spec()));
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    replacement_text_frame_left.push_back(
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        make_pair("REPLACE_WITH_BAD_HTTPS_PAGE", bad_https_url.spec()));
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string frame_left_path;
256c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (!net::SpawnedTestServer::GetFilePathWithReplacements(
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "frame_left.html",
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            replacement_text_frame_left,
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            &frame_left_path))
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Substitute the generated frame_left URL into the top_frame page.
263c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    std::vector<net::SpawnedTestServer::StringPair> replacement_text_top_frame;
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    replacement_text_top_frame.push_back(
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        make_pair("REPLACE_WITH_FRAME_LEFT_PATH", frame_left_path));
266c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return net::SpawnedTestServer::GetFilePathWithReplacements(
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "files/ssl/top_frame.html",
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        replacement_text_top_frame,
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        top_frame_path);
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static bool GetPageWithUnsafeWorkerPath(
273c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      const net::SpawnedTestServer& expired_https_server,
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::string* page_with_unsafe_worker_path) {
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Get the "imported.js" URL from the expired https server and
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // substitute it into the unsafe_worker.js file.
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GURL imported_js_url = expired_https_server.GetURL("files/ssl/imported.js");
278c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    std::vector<net::SpawnedTestServer::StringPair>
279c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        replacement_text_for_unsafe_worker;
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    replacement_text_for_unsafe_worker.push_back(
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        make_pair("REPLACE_WITH_IMPORTED_JS_URL", imported_js_url.spec()));
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string unsafe_worker_path;
283c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (!net::SpawnedTestServer::GetFilePathWithReplacements(
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "unsafe_worker.js",
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        replacement_text_for_unsafe_worker,
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        &unsafe_worker_path))
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Now, substitute this into the page with unsafe worker.
290c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    std::vector<net::SpawnedTestServer::StringPair>
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        replacement_text_for_page_with_unsafe_worker;
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    replacement_text_for_page_with_unsafe_worker.push_back(
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        make_pair("REPLACE_WITH_UNSAFE_WORKER_PATH", unsafe_worker_path));
294c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return net::SpawnedTestServer::GetFilePathWithReplacements(
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "files/ssl/page_with_unsafe_worker.html",
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        replacement_text_for_page_with_unsafe_worker,
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        page_with_unsafe_worker_path);
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
300c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  net::SpawnedTestServer https_server_;
301c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  net::SpawnedTestServer https_server_expired_;
302c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  net::SpawnedTestServer https_server_mismatched_;
303c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  net::SpawnedTestServer wss_server_expired_;
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
306c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  typedef net::SpawnedTestServer::SSLOptions SSLOptions;
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(SSLUITest);
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SSLUITestBlock : public SSLUITest {
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SSLUITestBlock() : SSLUITest() {}
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Browser will neither run nor display insecure content.
3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    command_line->AppendSwitch(switches::kNoDisplayingInsecureContent);
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SSLUITestIgnoreCertErrors : public SSLUITest {
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SSLUITestIgnoreCertErrors() : SSLUITest() {}
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Browser will ignore certificate errors.
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    command_line->AppendSwitch(switches::kIgnoreCertificateErrors);
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Visits a regular page over http.
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SSLUITest, TestHTTP) {
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(),
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               test_server()->GetURL("files/ssl/google.html"));
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CheckUnauthenticatedState(
3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->tab_strip_model()->GetActiveWebContents());
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Visits a page over http which includes broken https resources (status should
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// be OK).
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(jcampan): test that bad HTTPS content is blocked (otherwise we'll give
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//                the secure cookies away!).
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SSLUITest, TestHTTPWithBrokenHTTPSResource) {
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(https_server_expired_.Start());
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string replacement_path;
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetFilePathWithHostAndPortReplacement(
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "files/ssl/page_with_unsafe_contents.html",
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      https_server_expired_.host_port_pair(),
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &replacement_path));
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      browser(), test_server()->GetURL(replacement_path));
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CheckUnauthenticatedState(
3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->tab_strip_model()->GetActiveWebContents());
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://crbug.com/91745
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS)
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_TestOKHTTPS DISABLED_TestOKHTTPS
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_TestOKHTTPS TestOKHTTPS
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Visits a page over OK https:
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SSLUITest, MAYBE_TestOKHTTPS) {
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(https_server_.Start());
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(),
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               https_server_.GetURL("files/ssl/google.html"));
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CheckAuthenticatedState(
3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->tab_strip_model()->GetActiveWebContents(), false);
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Visits a page with https error and proceed:
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SSLUITest, TestHTTPSExpiredCertAndProceed) {
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(https_server_expired_.Start());
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(),
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      https_server_expired_.GetURL("files/ssl/google.html"));
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents();
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckAuthenticationBrokenState(tab, net::CERT_STATUS_DATE_INVALID, false,
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 true);  // Interstitial showing
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProceedThroughInterstitial(tab);
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckAuthenticationBrokenState(tab, net::CERT_STATUS_DATE_INVALID, false,
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 false);  // No interstitial showing
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Visits a page with https error and don't proceed (and ensure we can still
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// navigate at that point):
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SSLUITest, TestHTTPSExpiredCertAndDontProceed) {
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(https_server_.Start());
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(https_server_expired_.Start());
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // First navigate to an OK page.
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(),
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               https_server_.GetURL("files/ssl/google.html"));
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents();
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NavigationEntry* entry = tab->GetController().GetActiveEntry();
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(entry);
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL cross_site_url =
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      https_server_expired_.GetURL("files/ssl/google.html");
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Change the host name from 127.0.0.1 to localhost so it triggers a
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // cross-site navigation so we can test http://crbug.com/5800 is gone.
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ("127.0.0.1", cross_site_url.host());
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL::Replacements replacements;
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string new_host("localhost");
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  replacements.SetHostStr(new_host);
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cross_site_url = cross_site_url.ReplaceComponents(replacements);
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now go to a bad HTTPS page.
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), cross_site_url);
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // An interstitial should be showing.
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckAuthenticationBrokenState(tab, net::CERT_STATUS_COMMON_NAME_INVALID,
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 false, true);
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulate user clicking "Take me back".
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InterstitialPage* interstitial_page = tab->GetInterstitialPage();
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(interstitial_page);
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  interstitial_page->DontProceed();
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We should be back to the original good page.
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckAuthenticatedState(tab, false);
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Try to navigate to a new page. (to make sure bug 5800 is fixed).
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(),
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               test_server()->GetURL("files/ssl/google.html"));
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckUnauthenticatedState(tab);
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Visits a page with https error and then goes back using Browser::GoBack.
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SSLUITest,
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       TestHTTPSExpiredCertAndGoBackViaButton) {
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(https_server_expired_.Start());
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // First navigate to an HTTP page.
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(),
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_server()->GetURL("files/ssl/google.html"));
4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents();
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NavigationEntry* entry = tab->GetController().GetActiveEntry();
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(entry);
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now go to a bad HTTPS page that shows an interstitial.
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(),
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      https_server_expired_.GetURL("files/ssl/google.html"));
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckAuthenticationBrokenState(tab, net::CERT_STATUS_DATE_INVALID, false,
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 true);  // Interstitial showing
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProvisionalLoadWaiter load_failed_observer(tab);
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulate user clicking on back button (crbug.com/39248).
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::GoBack(browser(), CURRENT_TAB);
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Wait until we hear the load failure, and make sure we haven't swapped out
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the previous page.  Prevents regression of http://crbug.com/82667.
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  load_failed_observer.Wait();
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(content::RenderViewHostTester::IsRenderViewHostSwappedOut(
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      tab->GetRenderViewHost()));
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We should be back at the original good page.
4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(browser()->tab_strip_model()->GetActiveWebContents()->
4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   GetInterstitialPage());
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckUnauthenticatedState(tab);
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Visits a page with https error and then goes back using GoToOffset.
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Disabled because its flaky: http://crbug.com/40932, http://crbug.com/43575.
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SSLUITest,
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       TestHTTPSExpiredCertAndGoBackViaMenu) {
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(https_server_expired_.Start());
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // First navigate to an HTTP page.
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(),
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_server()->GetURL("files/ssl/google.html"));
4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents();
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NavigationEntry* entry = tab->GetController().GetActiveEntry();
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(entry);
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now go to a bad HTTPS page that shows an interstitial.
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(),
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      https_server_expired_.GetURL("files/ssl/google.html"));
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckAuthenticationBrokenState(tab, net::CERT_STATUS_DATE_INVALID, false,
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 true);  // Interstitial showing
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulate user clicking and holding on back button (crbug.com/37215).
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  tab->GetController().GoToOffset(-1);
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We should be back at the original good page.
5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(browser()->tab_strip_model()->GetActiveWebContents()->
5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   GetInterstitialPage());
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckUnauthenticatedState(tab);
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Visits a page with https error and then goes forward using GoToOffset.
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SSLUITest, TestHTTPSExpiredCertAndGoForward) {
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(https_server_expired_.Start());
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // First navigate to two HTTP pages.
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(),
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_server()->GetURL("files/ssl/google.html"));
5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents();
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NavigationEntry* entry1 = tab->GetController().GetActiveEntry();
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(entry1);
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(),
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_server()->GetURL("files/ssl/blank_page.html"));
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NavigationEntry* entry2 = tab->GetController().GetActiveEntry();
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(entry2);
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now go back so that a page is in the forward history.
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::WindowedNotificationObserver observer(
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::NOTIFICATION_LOAD_STOP,
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::Source<NavigationController>(&tab->GetController()));
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tab->GetController().GoBack();
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    observer.Wait();
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(tab->GetController().CanGoForward());
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NavigationEntry* entry3 = tab->GetController().GetActiveEntry();
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(entry1 == entry3);
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now go to a bad HTTPS page that shows an interstitial.
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(),
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      https_server_expired_.GetURL("files/ssl/google.html"));
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckAuthenticationBrokenState(tab, net::CERT_STATUS_DATE_INVALID, false,
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 true);  // Interstitial showing
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulate user clicking and holding on forward button.
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::WindowedNotificationObserver observer(
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::NOTIFICATION_LOAD_STOP,
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::Source<NavigationController>(&tab->GetController()));
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tab->GetController().GoToOffset(1);
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    observer.Wait();
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We should be showing the second good page.
5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(browser()->tab_strip_model()->GetActiveWebContents()->
5542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   GetInterstitialPage());
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckUnauthenticatedState(tab);
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(tab->GetController().CanGoForward());
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NavigationEntry* entry4 = tab->GetController().GetActiveEntry();
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(entry2 == entry4);
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Visit a HTTP page which request WSS connection to a server providing invalid
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// certificate. Close the page while WSS connection waits for SSLManager's
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// response from UI thread.
5642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Disabled on Windows because it was flaking on XP Tests (1). crbug.com/165258
5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN)
5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_TestWSSInvalidCertAndClose DISABLED_TestWSSInvalidCertAndClose
5672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
5682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_TestWSSInvalidCertAndClose TestWSSInvalidCertAndClose
5692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
5702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(SSLUITest, MAYBE_TestWSSInvalidCertAndClose) {
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(wss_server_expired_.Start());
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Setup page title observer.
5752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents();
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::TitleWatcher watcher(tab, ASCIIToUTF16("PASS"));
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  watcher.AlsoWaitForTitle(ASCIIToUTF16("FAIL"));
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create GURLs to test pages.
5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string masterUrlPath = base::StringPrintf("%s?%d",
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_server()->GetURL("files/ssl/wss_close.html").spec().c_str(),
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      wss_server_expired_.host_port_pair().port());
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL masterUrl(masterUrlPath);
5842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string slaveUrlPath = base::StringPrintf("%s?%d",
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_server()->GetURL("files/ssl/wss_close_slave.html").spec().c_str(),
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      wss_server_expired_.host_port_pair().port());
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL slaveUrl(slaveUrlPath);
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create tabs and visit pages which keep on creating wss connections.
5902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* tabs[16];
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < 16; ++i) {
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tabs[i] = chrome::AddSelectedTabWithURL(browser(), slaveUrl,
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            content::PAGE_TRANSITION_LINK);
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::SelectNextTab(browser());
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Visit a page which waits for one TLS handshake failure.
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The title will be changed to 'PASS'.
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), masterUrl);
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const string16 result = watcher.WaitAndGetTitle();
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(LowerCaseEqualsASCII(result, "pass"));
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Close tabs which contains the test page.
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < 16; ++i)
6052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    chrome::CloseWebContents(browser(), tabs[i], false);
6062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  chrome::CloseWebContents(browser(), tab, false);
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Visit a HTTPS page and proceeds despite an invalid certificate. The page
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// requests WSS connection to the same origin host to check if WSS connection
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// share certificates policy with HTTPS correcly.
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SSLUITest, TestWSSInvalidCertAndGoForward) {
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(wss_server_expired_.Start());
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Setup page title observer.
6172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents();
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::TitleWatcher watcher(tab, ASCIIToUTF16("PASS"));
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  watcher.AlsoWaitForTitle(ASCIIToUTF16("FAIL"));
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Visit bad HTTPS page.
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string scheme("https");
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL::Replacements replacements;
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  replacements.SetSchemeStr(scheme);
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      browser(),
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      wss_server_expired_.GetURL(
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          "connect_check.html").ReplaceComponents(replacements));
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckAuthenticationBrokenState(tab, net::CERT_STATUS_DATE_INVALID, false,
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 true);  // Interstitial showing
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Proceed anyway.
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProceedThroughInterstitial(tab);
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test page run a WebSocket wss connection test. The result will be shown
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // as page title.
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const string16 result = watcher.WaitAndGetTitle();
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(LowerCaseEqualsASCII(result, "pass"));
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_NSS)
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// SSL client certificate tests are only enabled when using NSS for private key
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// storage, as only NSS can avoid modifying global machine state when testing.
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// See http://crbug.com/51132
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Visit a HTTPS page which requires client cert authentication. The client
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// cert will be selected automatically, then a test which uses WebSocket runs.
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Disabled:  http://crbug.com/159985
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SSLUITest, DISABLED_TestWSSClientCert) {
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Open a temporary NSS DB for testing.
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  crypto::ScopedTestNSSDB test_nssdb;
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_nssdb.is_open());
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Import client cert for test. These interfaces require NSS.
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::NSSCertDatabase* cert_db = net::NSSCertDatabase::GetInstance();
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<net::CryptoModule> crypt_module = cert_db->GetPublicModule();
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string pkcs12_data;
6582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath cert_path = net::GetTestCertsDirectory().Append(
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FILE_PATH_LITERAL("websocket_client_cert.p12"));
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(file_util::ReadFileToString(cert_path, &pkcs12_data));
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(net::OK, cert_db->ImportFromPKCS12(crypt_module,
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               pkcs12_data,
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               string16(),
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               true,
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               NULL));
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Start WebSocket test server with TLS and client cert authentication.
668c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  net::SpawnedTestServer::SSLOptions options(
669c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      net::SpawnedTestServer::SSLOptions::CERT_OK);
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  options.request_client_certificate = true;
6712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath ca_path = net::GetTestCertsDirectory().Append(
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FILE_PATH_LITERAL("websocket_cacert.pem"));
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  options.client_authorities.push_back(ca_path);
674c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  net::SpawnedTestServer wss_server(net::SpawnedTestServer::TYPE_WSS,
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             options,
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             net::GetWebSocketTestDataDirectory());
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(wss_server.Start());
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string scheme("https");
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL::Replacements replacements;
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  replacements.SetSchemeStr(scheme);
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url = wss_server.GetURL("connect_check.html").ReplaceComponents(
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      replacements);
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Setup page title observer.
6852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents();
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::TitleWatcher watcher(tab, ASCIIToUTF16("PASS"));
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  watcher.AlsoWaitForTitle(ASCIIToUTF16("FAIL"));
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add an entry into AutoSelectCertificateForUrls policy for automatic client
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // cert selection.
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Profile* profile = Profile::FromBrowserContext(tab->GetBrowserContext());
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(profile);
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<DictionaryValue> dict(new DictionaryValue());
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dict->SetString("ISSUER.CN", "pywebsocket");
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile->GetHostContentSettingsMap()->SetWebsiteSetting(
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ContentSettingsPattern::FromURL(url),
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ContentSettingsPattern::FromURL(url),
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CONTENT_SETTINGS_TYPE_AUTO_SELECT_CERTIFICATE,
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::string(),
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dict.release());
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Visit a HTTPS page which requires client certs.
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), url);
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckAuthenticatedState(tab, false);
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test page runs a WebSocket wss connection test. The result will be shown
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // as page title.
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const string16 result = watcher.WaitAndGetTitle();
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(LowerCaseEqualsASCII(result, "pass"));
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // defined(USE_NSS)
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Flaky on CrOS http://crbug.com/92292
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS)
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_TestHTTPSErrorWithNoNavEntry \
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DISABLED_TestHTTPSErrorWithNoNavEntry
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_TestHTTPSErrorWithNoNavEntry TestHTTPSErrorWithNoNavEntry
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // defined(OS_CHROMEOS)
7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Open a page with a HTTPS error in a tab with no prior navigation (through a
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// link with a blank target).  This is to test that the lack of navigation entry
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// does not cause any problems (it was causing a crasher, see
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://crbug.com/19941).
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SSLUITest, MAYBE_TestHTTPSErrorWithNoNavEntry) {
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(https_server_expired_.Start());
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url = https_server_expired_.GetURL("files/ssl/google.htm");
7292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* tab2 = chrome::AddSelectedTabWithURL(
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      browser(), url, content::PAGE_TRANSITION_TYPED);
7312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  content::WaitForLoadStop(tab2);
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify our assumption that there was no prior navigation.
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(chrome::CanGoBack(browser()));
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We should have an interstitial page showing.
7372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(tab2->GetInterstitialPage());
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SSLUITest, TestBadHTTPSDownload) {
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(https_server_expired_.Start());
743c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GURL url_non_dangerous = test_server()->GetURL(std::string());
744c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GURL url_dangerous =
745c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      https_server_expired_.GetURL("files/downloads/dangerous/dangerous.exe");
7462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::ScopedTempDir downloads_directory_;
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Need empty temp dir to avoid having Chrome ask us for a new filename
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // when we've downloaded dangerous.exe one hundred times.
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(downloads_directory_.CreateUniqueTempDir());
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  browser()->profile()->GetPrefs()->SetFilePath(
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      prefs::kDownloadDefaultDirectory,
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      downloads_directory_.path());
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Visit a non-dangerous page.
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), url_non_dangerous);
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now, start a transition to dangerous download.
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::WindowedNotificationObserver observer(
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::NOTIFICATION_LOAD_STOP,
7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::NotificationService::AllSources());
7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    chrome::NavigateParams navigate_params(browser(), url_dangerous,
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           content::PAGE_TRANSITION_TYPED);
7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    chrome::Navigate(&navigate_params);
7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    observer.Wait();
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // To exit the browser cleanly (and this test) we need to complete the
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // download after completing this test.
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::DownloadTestObserverTerminal dangerous_download_observer(
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::BrowserContext::GetDownloadManager(browser()->profile()),
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      1,
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::DownloadTestObserver::ON_DANGEROUS_DOWNLOAD_ACCEPT);
7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Proceed through the SSL interstitial. This doesn't use
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |ProceedThroughInterstitial| since no page load will commit.
7792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents();
7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(tab != NULL);
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(tab->GetInterstitialPage() != NULL);
7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::WindowedNotificationObserver observer(
7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        chrome::NOTIFICATION_DOWNLOAD_INITIATED,
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::NotificationService::AllSources());
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tab->GetInterstitialPage()->Proceed();
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    observer.Wait();
7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // There should still be an interstitial at this point. Press the
7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // back button on the browser. Note that this doesn't wait for a
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // NAV_ENTRY_COMMITTED notification because going back with an
7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // active interstitial simply hides the interstitial.
7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(tab->GetInterstitialPage() != NULL);
7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(chrome::CanGoBack(browser()));
7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::GoBack(browser(), CURRENT_TAB);
7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dangerous_download_observer.WaitForFinished();
7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Insecure content
8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://crbug.com/152940 Flaky on win.
8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_TestDisplaysInsecureContent DISABLED_TestDisplaysInsecureContent
8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_TestDisplaysInsecureContent TestDisplaysInsecureContent
8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Visits a page that displays insecure content.
8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SSLUITest, MAYBE_TestDisplaysInsecureContent) {
8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(https_server_.Start());
8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string replacement_path;
8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetFilePathWithHostAndPortReplacement(
8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "files/ssl/page_displays_insecure_content.html",
8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_server()->host_port_pair(),
8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &replacement_path));
8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Load a page that displays insecure content.
8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(),
8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               https_server_.GetURL(replacement_path));
8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CheckAuthenticatedState(
8282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->tab_strip_model()->GetActiveWebContents(), true);
8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Visits a page that runs insecure content and tries to suppress the insecure
8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// content warnings by randomizing location.hash.
8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Based on http://crbug.com/8706
8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SSLUITest,
8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       TestRunsInsecuredContentRandomizeHash) {
8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(https_server_.Start());
8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), https_server_.GetURL(
8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "files/ssl/page_runs_insecure_content.html"));
8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CheckAuthenticationBrokenState(
8432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->tab_strip_model()->GetActiveWebContents(), 0, true, false);
8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Visits a page with unsafe content and make sure that:
8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - frames content is replaced with warning
8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - images and scripts are filtered out entirely
8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SSLUITest, TestUnsafeContents) {
8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(https_server_.Start());
8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(https_server_expired_.Start());
8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string replacement_path;
8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetFilePathWithHostAndPortReplacement(
8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "files/ssl/page_with_unsafe_contents.html",
8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      https_server_expired_.host_port_pair(),
8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &replacement_path));
8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(),
8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               https_server_.GetURL(replacement_path));
8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents();
8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // When the bad content is filtered, the state is expected to be
8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // authenticated.
8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckAuthenticatedState(tab, false);
8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Because of cross-frame scripting restrictions, we cannot access the iframe
8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // content.  So to know if the frame was loaded, we just check if a popup was
8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // opened (the iframe content opens one).
8692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Note: because of bug 1115868, no web contents modal dialog is opened right
8702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //       now.  Once the bug is fixed, this will do the real check.
8712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(IsShowingWebContentsModalDialog());
8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int img_width;
8742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(content::ExecuteScriptAndExtractInt(
8752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      tab,
8762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "window.domAutomationController.send(ImageWidth());",
8772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &img_width));
8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // In order to check that the image was not loaded, we check its width.
8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The actual image (Google logo) is 114 pixels wide, we assume the broken
8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // image is less than 100.
8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_LT(img_width, 100);
8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool js_result = false;
8842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(content::ExecuteScriptAndExtractBool(
8852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      tab,
8862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "window.domAutomationController.send(IsFooSet());",
8872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &js_result));
8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(js_result);
8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Visits a page with insecure content loaded by JS (after the initial page
8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// load).
8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SSLUITest, TestDisplaysInsecureContentLoadedFromJS) {
8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(https_server_.Start());
8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string replacement_path;
8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetFilePathWithHostAndPortReplacement(
8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "files/ssl/page_with_dynamic_insecure_content.html",
9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_server()->host_port_pair(),
9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &replacement_path));
9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), https_server_.GetURL(
9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      replacement_path));
9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents();
9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckAuthenticatedState(tab, false);
9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Load the insecure image.
9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool js_result = false;
9102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(content::ExecuteScriptAndExtractBool(
9112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      tab,
9122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "loadBadImage();",
9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &js_result));
9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(js_result);
9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We should now have insecure content.
9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckAuthenticatedState(tab, true);
9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Visits two pages from the same origin: one that displays insecure content and
9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// one that doesn't.  The test checks that we do not propagate the insecure
9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// content state from one to the other.
9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SSLUITest, TestDisplaysInsecureContentTwoTabs) {
9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(https_server_.Start());
9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(),
9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      https_server_.GetURL("files/ssl/blank_page.html"));
9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* tab1 = browser()->tab_strip_model()->GetActiveWebContents();
9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This tab should be fine.
9332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CheckAuthenticatedState(tab1, false);
9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create a new tab.
9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string replacement_path;
9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetFilePathWithHostAndPortReplacement(
9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "files/ssl/page_displays_insecure_content.html",
9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_server()->host_port_pair(),
9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &replacement_path));
9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url = https_server_.GetURL(replacement_path);
9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::NavigateParams params(browser(), url, content::PAGE_TRANSITION_TYPED);
9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params.disposition = NEW_FOREGROUND_TAB;
9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params.tabstrip_index = 0;
9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params.source_contents = tab1;
9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::WindowedNotificationObserver observer(
9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::NOTIFICATION_LOAD_STOP,
9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::NotificationService::AllSources());
9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::Navigate(&params);
9512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* tab2 = params.target_contents;
9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  observer.Wait();
9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The new tab has insecure content.
9552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CheckAuthenticatedState(tab2, true);
9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The original tab should not be contaminated.
9582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CheckAuthenticatedState(tab1, false);
9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Visits two pages from the same origin: one that runs insecure content and one
9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// that doesn't.  The test checks that we propagate the insecure content state
9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// from one to the other.
9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SSLUITest, TestRunsInsecureContentTwoTabs) {
9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(https_server_.Start());
9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(),
9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      https_server_.GetURL("files/ssl/blank_page.html"));
9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* tab1 = browser()->tab_strip_model()->GetActiveWebContents();
9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This tab should be fine.
9742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CheckAuthenticatedState(tab1, false);
9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string replacement_path;
9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetFilePathWithHostAndPortReplacement(
9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "files/ssl/page_runs_insecure_content.html",
9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_server()->host_port_pair(),
9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &replacement_path));
9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create a new tab in the same process.  Using a NEW_FOREGROUND_TAB
9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // disposition won't usually stay in the same process, but this works
9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // because we are using process-per-site in SetUpCommandLine.
9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url = https_server_.GetURL(replacement_path);
9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::NavigateParams params(browser(), url, content::PAGE_TRANSITION_TYPED);
9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params.disposition = NEW_FOREGROUND_TAB;
9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params.source_contents = tab1;
9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::WindowedNotificationObserver observer(
9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::NOTIFICATION_LOAD_STOP,
9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::NotificationService::AllSources());
9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::Navigate(&params);
9932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* tab2 = params.target_contents;
9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  observer.Wait();
9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Both tabs should have the same process.
9972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(tab1->GetRenderProcessHost(),
9982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            tab2->GetRenderProcessHost());
9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The new tab has insecure content.
10012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CheckAuthenticationBrokenState(tab2, 0, true, false);
10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Which means the origin for the first tab has also been contaminated with
10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // insecure content.
10052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CheckAuthenticationBrokenState(tab1, 0, true, false);
10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Visits a page with an image over http.  Visits another page over https
10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// referencing that same image over http (hoping it is coming from the webcore
10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// memory cache).
10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SSLUITest, TestDisplaysCachedInsecureContent) {
10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(https_server_.Start());
10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string replacement_path;
10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetFilePathWithHostAndPortReplacement(
10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "files/ssl/page_displays_insecure_content.html",
10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_server()->host_port_pair(),
10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &replacement_path));
10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Load original page over HTTP.
10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GURL url_http = test_server()->GetURL(replacement_path);
10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), url_http);
10242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents();
10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckUnauthenticatedState(tab);
10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Load again but over SSL.  It should be marked as displaying insecure
10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // content (even though the image comes from the WebCore memory cache).
10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GURL url_https = https_server_.GetURL(replacement_path);
10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), url_https);
10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckAuthenticatedState(tab, true);
10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://crbug.com/84729
10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS)
10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_TestRunsCachedInsecureContent \
10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DISABLED_TestRunsCachedInsecureContent
10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_TestRunsCachedInsecureContent TestRunsCachedInsecureContent
10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // defined(OS_CHROMEOS)
10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Visits a page with script over http.  Visits another page over https
10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// referencing that same script over http (hoping it is coming from the webcore
10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// memory cache).
10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SSLUITest, MAYBE_TestRunsCachedInsecureContent) {
10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(https_server_.Start());
10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string replacement_path;
10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetFilePathWithHostAndPortReplacement(
10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "files/ssl/page_runs_insecure_content.html",
10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_server()->host_port_pair(),
10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &replacement_path));
10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Load original page over HTTP.
10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GURL url_http = test_server()->GetURL(replacement_path);
10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), url_http);
10582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents();
10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckUnauthenticatedState(tab);
10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Load again but over SSL.  It should be marked as displaying insecure
10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // content (even though the image comes from the WebCore memory cache).
10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GURL url_https = https_server_.GetURL(replacement_path);
10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), url_https);
10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckAuthenticationBrokenState(tab, 0, true, false);
10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This test ensures the CN invalid status does not 'stick' to a certificate
10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// (see bug #1044942) and that it depends on the host-name.
10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SSLUITest, TestCNInvalidStickiness) {
10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(https_server_.Start());
10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(https_server_mismatched_.Start());
10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // First we hit the server with hostname, this generates an invalid policy
10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // error.
10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(),
10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      https_server_mismatched_.GetURL("files/ssl/google.html"));
10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We get an interstitial page as a result.
10802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents();
10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckAuthenticationBrokenState(tab, net::CERT_STATUS_COMMON_NAME_INVALID,
10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 false, true);  // Interstitial showing.
10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProceedThroughInterstitial(tab);
10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckAuthenticationBrokenState(tab, net::CERT_STATUS_COMMON_NAME_INVALID,
10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 false, false);  // No interstitial showing.
10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now we try again with the right host name this time.
10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url(https_server_.GetURL("files/ssl/google.html"));
10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), url);
10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Security state should be OK.
10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckAuthenticatedState(tab, false);
10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now try again the broken one to make sure it is still broken.
10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(),
10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      https_server_mismatched_.GetURL("files/ssl/google.html"));
10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Since we OKed the interstitial last time, we get right to the page.
10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckAuthenticationBrokenState(tab, net::CERT_STATUS_COMMON_NAME_INVALID,
11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 false, false);  // No interstitial showing.
11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS)
11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This test seems to be flaky and hang on chromiumos.
11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://crbug.com/84419
11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_TestRefNavigation DISABLED_TestRefNavigation
11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_TestRefNavigation TestRefNavigation
11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that navigating to a #ref does not change a bad security state.
11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SSLUITest, TestRefNavigation) {
11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(https_server_expired_.Start());
11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(),
11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      https_server_expired_.GetURL("files/ssl/page_with_refs.html"));
11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents();
11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckAuthenticationBrokenState(tab, net::CERT_STATUS_DATE_INVALID, false,
11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 true);  // Interstitial showing.
11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProceedThroughInterstitial(tab);
11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckAuthenticationBrokenState(tab, net::CERT_STATUS_DATE_INVALID, false,
11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 false);  // No interstitial showing.
11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now navigate to a ref in the page, the security state should not have
11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // changed.
11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(),
11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      https_server_expired_.GetURL("files/ssl/page_with_refs.html#jp"));
11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckAuthenticationBrokenState(tab, net::CERT_STATUS_DATE_INVALID, false,
11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 false);  // No interstitial showing.
11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that closing a page that has a unsafe pop-up does not crash the
11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// browser (bug #1966).
11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(jcampan): http://crbug.com/2136 disabled because the popup is not
11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//                opened as it is not initiated by a user gesture.
11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SSLUITest, DISABLED_TestCloseTabWithUnsafePopup) {
11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(https_server_expired_.Start());
11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string replacement_path;
11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetFilePathWithHostAndPortReplacement(
11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "files/ssl/page_with_unsafe_popup.html",
11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      https_server_expired_.host_port_pair(),
11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &replacement_path));
11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(),
11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               test_server()->GetURL(replacement_path));
11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* tab1 = browser()->tab_strip_model()->GetActiveWebContents();
11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // It is probably overkill to add a notification for a popup-opening, let's
11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // just poll.
11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < 10; i++) {
11572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (IsShowingWebContentsModalDialog())
11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MessageLoop::current()->PostDelayedTask(
11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        FROM_HERE, MessageLoop::QuitClosure(), base::TimeDelta::FromSeconds(1));
11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::RunMessageLoop();
11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(IsShowingWebContentsModalDialog());
11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Let's add another tab to make sure the browser does not exit when we close
11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the first tab.
11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url = test_server()->GetURL("files/ssl/google.html");
11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::WindowedNotificationObserver observer(
11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::NOTIFICATION_LOAD_STOP,
11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::NotificationService::AllSources());
11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::AddSelectedTabWithURL(browser(), url, content::PAGE_TRANSITION_TYPED);
11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  observer.Wait();
11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Close the first tab.
11752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  chrome::CloseWebContents(browser(), tab1, false);
11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Visit a page over bad https that is a redirect to a page with good https.
11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SSLUITest, TestRedirectBadToGoodHTTPS) {
11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(https_server_.Start());
11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(https_server_expired_.Start());
11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url1 = https_server_expired_.GetURL("server-redirect?");
11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url2 = https_server_.GetURL("files/ssl/google.html");
11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), GURL(url1.spec() + url2.spec()));
11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents();
11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckAuthenticationBrokenState(tab, net::CERT_STATUS_DATE_INVALID, false,
11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 true);  // Interstitial showing.
11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProceedThroughInterstitial(tab);
11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We have been redirected to the good page.
11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckAuthenticatedState(tab, false);
11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Visit a page over good https that is a redirect to a page with bad https.
12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SSLUITest, TestRedirectGoodToBadHTTPS) {
12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(https_server_.Start());
12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(https_server_expired_.Start());
12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url1 = https_server_.GetURL("server-redirect?");
12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url2 = https_server_expired_.GetURL("files/ssl/google.html");
12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), GURL(url1.spec() + url2.spec()));
12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents();
12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckAuthenticationBrokenState(tab, net::CERT_STATUS_DATE_INVALID, false,
12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 true);  // Interstitial showing.
12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProceedThroughInterstitial(tab);
12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckAuthenticationBrokenState(tab, net::CERT_STATUS_DATE_INVALID, false,
12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 false);  // No interstitial showing.
12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Visit a page over http that is a redirect to a page with good HTTPS.
12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SSLUITest, TestRedirectHTTPToGoodHTTPS) {
12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(https_server_.Start());
12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents();
12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // HTTP redirects to good HTTPS.
12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL http_url = test_server()->GetURL("server-redirect?");
12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL good_https_url =
12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      https_server_.GetURL("files/ssl/google.html");
12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(),
12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               GURL(http_url.spec() + good_https_url.spec()));
12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckAuthenticatedState(tab, false);
12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Visit a page over http that is a redirect to a page with bad HTTPS.
12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SSLUITest, TestRedirectHTTPToBadHTTPS) {
12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(https_server_expired_.Start());
12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents();
12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL http_url = test_server()->GetURL("server-redirect?");
12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL bad_https_url =
12445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      https_server_expired_.GetURL("files/ssl/google.html");
12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(),
12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               GURL(http_url.spec() + bad_https_url.spec()));
12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckAuthenticationBrokenState(tab, net::CERT_STATUS_DATE_INVALID, false,
12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 true);  // Interstitial showing.
12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProceedThroughInterstitial(tab);
12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckAuthenticationBrokenState(tab, net::CERT_STATUS_DATE_INVALID, false,
12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 false);  // No interstitial showing.
12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Visit a page over https that is a redirect to a page with http (to make sure
12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// we don't keep the secure state).
12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SSLUITest, TestRedirectHTTPSToHTTP) {
12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(https_server_.Start());
12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL https_url = https_server_.GetURL("server-redirect?");
12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL http_url = test_server()->GetURL("files/ssl/google.html");
12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(),
12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               GURL(https_url.spec() + http_url.spec()));
12672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CheckUnauthenticatedState(
12682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->tab_strip_model()->GetActiveWebContents());
12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Visits a page to which we could not connect (bad port) over http and https
12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// and make sure the security style is correct.
12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SSLUITest, TestConnectToBadPort) {
12745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), GURL("http://localhost:17"));
12752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CheckUnauthenticatedState(
12762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->tab_strip_model()->GetActiveWebContents());
12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Same thing over HTTPS.
12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), GURL("https://localhost:17"));
12802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CheckUnauthenticatedState(
12812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->tab_strip_model()->GetActiveWebContents());
12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Frame navigation
12865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
12875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// From a good HTTPS top frame:
12895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - navigate to an OK HTTPS frame
12905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - navigate to a bad HTTPS (expect unsafe content and filtered frame), then
12915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   back
12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - navigate to HTTP (expect insecure content), then back
12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SSLUITest, TestGoodFrameNavigation) {
12945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
12955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(https_server_.Start());
12965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(https_server_expired_.Start());
12975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string top_frame_path;
12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetTopFramePath(*test_server(),
13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              https_server_,
13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              https_server_expired_,
13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              &top_frame_path));
13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents();
13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(),
13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               https_server_.GetURL(top_frame_path));
13075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckAuthenticatedState(tab, false);
13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool success = false;
13115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now navigate inside the frame.
13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::WindowedNotificationObserver observer(
13145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::NOTIFICATION_LOAD_STOP,
13155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::Source<NavigationController>(&tab->GetController()));
13162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(content::ExecuteScriptAndExtractBool(
13172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        tab,
13182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "window.domAutomationController.send(clickLink('goodHTTPSLink'));",
13195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        &success));
13205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(success);
13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    observer.Wait();
13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We should still be fine.
13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckAuthenticatedState(tab, false);
13265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now let's hit a bad page.
13285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
13295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::WindowedNotificationObserver observer(
13305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::NOTIFICATION_LOAD_STOP,
13315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::Source<NavigationController>(&tab->GetController()));
13322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(content::ExecuteScriptAndExtractBool(
13332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        tab,
13342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "window.domAutomationController.send(clickLink('badHTTPSLink'));",
13355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        &success));
13365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(success);
13375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    observer.Wait();
13385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The security style should still be secure.
13415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckAuthenticatedState(tab, false);
13425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // And the frame should be blocked.
13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_content_evil = true;
13452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string content_frame_xpath("html/frameset/frame[2]");
13462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string is_evil_js("window.domAutomationController.send("
13472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         "document.getElementById('evilDiv') != null);");
13482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(content::ExecuteScriptInFrameAndExtractBool(
13492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      tab,
13502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content_frame_xpath,
13512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      is_evil_js,
13525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &is_content_evil));
13535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(is_content_evil);
13545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now go back, our state should still be OK.
13565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
13575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::WindowedNotificationObserver observer(
13585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::NOTIFICATION_LOAD_STOP,
13595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::Source<NavigationController>(&tab->GetController()));
13605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tab->GetController().GoBack();
13615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    observer.Wait();
13625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckAuthenticatedState(tab, false);
13645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Navigate to a page served over HTTP.
13665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
13675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::WindowedNotificationObserver observer(
13685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::NOTIFICATION_LOAD_STOP,
13695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::Source<NavigationController>(&tab->GetController()));
13702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(content::ExecuteScriptAndExtractBool(
13712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        tab,
13722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "window.domAutomationController.send(clickLink('HTTPLink'));",
13735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        &success));
13745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(success);
13755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    observer.Wait();
13765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Our state should be insecure.
13795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckAuthenticatedState(tab, true);
13805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Go back, our state should be unchanged.
13825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
13835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::WindowedNotificationObserver observer(
13845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::NOTIFICATION_LOAD_STOP,
13855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::Source<NavigationController>(&tab->GetController()));
13865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tab->GetController().GoBack();
13875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    observer.Wait();
13885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckAuthenticatedState(tab, true);
13905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// From a bad HTTPS top frame:
13935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - navigate to an OK HTTPS frame (expected to be still authentication broken).
13945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SSLUITest, TestBadFrameNavigation) {
13955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(https_server_.Start());
13965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(https_server_expired_.Start());
13975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string top_frame_path;
13995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetTopFramePath(*test_server(),
14005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              https_server_,
14015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              https_server_expired_,
14025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              &top_frame_path));
14035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents();
14055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(),
14065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               https_server_expired_.GetURL(top_frame_path));
14075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckAuthenticationBrokenState(tab, net::CERT_STATUS_DATE_INVALID, false,
14085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 true);  // Interstitial showing
14095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProceedThroughInterstitial(tab);
14115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Navigate to a good frame.
14135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool success = false;
14145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::WindowedNotificationObserver observer(
14155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::NOTIFICATION_LOAD_STOP,
14165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::Source<NavigationController>(&tab->GetController()));
14172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(content::ExecuteScriptAndExtractBool(
14182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      tab,
14192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "window.domAutomationController.send(clickLink('goodHTTPSLink'));",
14205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &success));
14215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(success);
14225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  observer.Wait();
14235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We should still be authentication broken.
14255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckAuthenticationBrokenState(tab, net::CERT_STATUS_DATE_INVALID, false,
14265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 false);
14275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// From an HTTP top frame, navigate to good and bad HTTPS (security state should
14305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// stay unauthenticated).
14315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Disabled, flakily exceeds test timeout, http://crbug.com/43437.
14325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SSLUITest, DISABLED_TestUnauthenticatedFrameNavigation) {
14335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
14345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(https_server_.Start());
14355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(https_server_expired_.Start());
14365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string top_frame_path;
14385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetTopFramePath(*test_server(),
14395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              https_server_,
14405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              https_server_expired_,
14415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              &top_frame_path));
14425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents();
14445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(),
14455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               test_server()->GetURL(top_frame_path));
14465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckUnauthenticatedState(tab);
14475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now navigate inside the frame to a secure HTTPS frame.
14495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
14505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool success = false;
14515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::WindowedNotificationObserver observer(
14525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::NOTIFICATION_LOAD_STOP,
14535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::Source<NavigationController>(&tab->GetController()));
14542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(content::ExecuteScriptAndExtractBool(
14552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        tab,
14562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "window.domAutomationController.send(clickLink('goodHTTPSLink'));",
14575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        &success));
14585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(success);
14595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    observer.Wait();
14605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
14615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We should still be unauthenticated.
14635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckUnauthenticatedState(tab);
14645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now navigate to a bad HTTPS frame.
14665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
14675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool success = false;
14685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::WindowedNotificationObserver observer(
14695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::NOTIFICATION_LOAD_STOP,
14705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::Source<NavigationController>(&tab->GetController()));
14712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(content::ExecuteScriptAndExtractBool(
14722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        tab,
14732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "window.domAutomationController.send(clickLink('badHTTPSLink'));",
14745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        &success));
14755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(success);
14765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    observer.Wait();
14775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
14785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // State should not have changed.
14805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckUnauthenticatedState(tab);
14815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // And the frame should have been blocked (see bug #2316).
14835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_content_evil = true;
14842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string content_frame_xpath("html/frameset/frame[2]");
14852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string is_evil_js("window.domAutomationController.send("
14862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         "document.getElementById('evilDiv') != null);");
14872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(content::ExecuteScriptInFrameAndExtractBool(
14882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      tab,
14892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content_frame_xpath,
14902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      is_evil_js,
14915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &is_content_evil));
14925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(is_content_evil);
14935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SSLUITest, TestUnsafeContentsInWorkerFiltered) {
14965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(https_server_.Start());
14975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(https_server_expired_.Start());
14985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This page will spawn a Worker which will try to load content from
15005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // BadCertServer.
15015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string page_with_unsafe_worker_path;
15025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetPageWithUnsafeWorkerPath(https_server_expired_,
15035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          &page_with_unsafe_worker_path));
15045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), https_server_.GetURL(
15055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      page_with_unsafe_worker_path));
15062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents();
15075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Expect Worker not to load insecure content.
15085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckWorkerLoadResult(tab, false);
15095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The bad content is filtered, expect the state to be authenticated.
15105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckAuthenticatedState(tab, false);
15115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SSLUITest, TestUnsafeContentsInWorker) {
15145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(https_server_.Start());
15155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(https_server_expired_.Start());
15165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Navigate to an unsafe site. Proceed with interstitial page to indicate
15185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the user approves the bad certificate.
15195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(),
15205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      https_server_expired_.GetURL("files/ssl/blank_page.html"));
15212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents();
15225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckAuthenticationBrokenState(tab, net::CERT_STATUS_DATE_INVALID, false,
15235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 true);  // Interstitial showing
15245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProceedThroughInterstitial(tab);
15255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckAuthenticationBrokenState(tab, net::CERT_STATUS_DATE_INVALID, false,
15265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 false);  // No Interstitial
15275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Navigate to safe page that has Worker loading unsafe content.
15295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Expect content to load but be marked as auth broken due to running insecure
15305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // content.
15315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string page_with_unsafe_worker_path;
15325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetPageWithUnsafeWorkerPath(https_server_expired_,
15335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          &page_with_unsafe_worker_path));
15345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), https_server_.GetURL(
15355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      page_with_unsafe_worker_path));
15365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckWorkerLoadResult(tab, true);  // Worker loads insecure content
15375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckAuthenticationBrokenState(tab, 0, true, false);
15385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that when the browser blocks displaying insecure content (images), the
15415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// indicator shows a secure page, because the blocking made the otherwise
15425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// unsafe page safe (the notification of this state is handled by other means).
15435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SSLUITestBlock, TestBlockDisplayingInsecureImage) {
15445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
15455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(https_server_.Start());
15465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string replacement_path;
15485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetFilePathWithHostAndPortReplacement(
15495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "files/ssl/page_displays_insecure_content.html",
15505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_server()->host_port_pair(),
15515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &replacement_path));
15525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(),
15545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               https_server_.GetURL(replacement_path));
15555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CheckAuthenticatedState(
15572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->tab_strip_model()->GetActiveWebContents(), false);
15585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that when the browser blocks displaying insecure content (iframes), the
15615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// indicator shows a secure page, because the blocking made the otherwise
15625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// unsafe page safe (the notification of this state is handled by other means)
15635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SSLUITestBlock, TestBlockDisplayingInsecureIframe) {
15645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
15655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(https_server_.Start());
15665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string replacement_path;
15685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetFilePathWithHostAndPortReplacement(
15695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "files/ssl/page_displays_insecure_iframe.html",
15705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_server()->host_port_pair(),
15715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &replacement_path));
15725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(),
15745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               https_server_.GetURL(replacement_path));
15755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CheckAuthenticatedState(
15772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->tab_strip_model()->GetActiveWebContents(), false);
15785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that when the browser blocks running insecure content, the
15825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// indicator shows a secure page, because the blocking made the otherwise
15835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// unsafe page safe (the notification of this state is handled by other means).
15845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SSLUITestBlock, TestBlockRunningInsecureContent) {
15855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
15865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(https_server_.Start());
15875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string replacement_path;
15895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetFilePathWithHostAndPortReplacement(
15905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "files/ssl/page_runs_insecure_content.html",
15915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_server()->host_port_pair(),
15925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &replacement_path));
15935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(),
15955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               https_server_.GetURL(replacement_path));
15965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CheckAuthenticatedState(
15982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->tab_strip_model()->GetActiveWebContents(), false);
15995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Visit a page and establish a WebSocket connection over bad https with
16025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// --ignore-certificate-errors. The connection should be established without
16035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// interstitial page showing.
16045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SSLUITestIgnoreCertErrors, TestWSS) {
16055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
16065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(wss_server_expired_.Start());
16075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Setup page title observer.
16092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents();
16105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::TitleWatcher watcher(tab, ASCIIToUTF16("PASS"));
16115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  watcher.AlsoWaitForTitle(ASCIIToUTF16("FAIL"));
16125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Visit bad HTTPS page.
16145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string scheme("https");
16155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL::Replacements replacements;
16165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  replacements.SetSchemeStr(scheme);
16175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(
16185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      browser(),
16195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      wss_server_expired_.GetURL(
16205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          "connect_check.html").ReplaceComponents(replacements));
16215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We shouldn't have an interstitial page showing here.
16235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test page run a WebSocket wss connection test. The result will be shown
16255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // as page title.
16265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const string16 result = watcher.WaitAndGetTitle();
16275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(LowerCaseEqualsASCII(result, "pass"));
16285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(jcampan): more tests to do below.
16315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Visit a page over https that contains a frame with a redirect.
16335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// XMLHttpRequest insecure content in synchronous mode.
16355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// XMLHttpRequest insecure content in asynchronous mode.
16375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// XMLHttpRequest over bad ssl in synchronous mode.
16395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// XMLHttpRequest over OK ssl in synchronous mode.
1641