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"
8868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h"
9868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/stringprintf.h"
10868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
11eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/app/chrome_command_ids.h"
137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/content_settings/host_content_settings_map.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_commands.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_navigator.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_tabstrip.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/tabs/tab_strip_model.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_paths.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_switches.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/in_process_browser_test.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/ui_test_utils.h"
2690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "components/web_modal/web_contents_modal_dialog_manager.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"
45b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "net/test/spawned_test_server/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;
5690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)using web_modal::WebContentsModalDialogManager;
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const base::FilePath::CharType kDocRoot[] =
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FILE_PATH_LITERAL("chrome/test/data");
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ProvisionalLoadWaiter : public content::WebContentsObserver {
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit ProvisionalLoadWaiter(WebContents* tab)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : WebContentsObserver(tab), waiting_(false), seen_(false) {}
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Wait() {
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (seen_)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    waiting_ = true;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::RunMessageLoop();
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void DidFailProvisionalLoad(
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int64 frame_id,
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bool is_main_frame,
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const GURL& validated_url,
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int error_code,
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const string16& error_description,
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::RenderViewHost* render_view_host) OVERRIDE {
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    seen_ = true;
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (waiting_)
8590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      base::MessageLoopForUI::current()->Quit();
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool waiting_;
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool seen_;
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SSLUITest : public InProcessBrowserTest {
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SSLUITest()
98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      : https_server_(net::SpawnedTestServer::TYPE_HTTPS,
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      SSLOptions(SSLOptions::CERT_OK),
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      base::FilePath(kDocRoot)),
101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        https_server_expired_(net::SpawnedTestServer::TYPE_HTTPS,
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              SSLOptions(SSLOptions::CERT_EXPIRED),
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              base::FilePath(kDocRoot)),
104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        https_server_mismatched_(net::SpawnedTestServer::TYPE_HTTPS,
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 SSLOptions(SSLOptions::CERT_MISMATCHED_NAME),
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 base::FilePath(kDocRoot)),
107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        wss_server_expired_(net::SpawnedTestServer::TYPE_WSS,
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            SSLOptions(SSLOptions::CERT_EXPIRED),
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            net::GetWebSocketTestDataDirectory()) {}
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Browser will both run and display insecure content.
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    command_line->AppendSwitch(switches::kAllowRunningInsecureContent);
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Use process-per-site so that navigating to a same-site page in a
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // new tab will use the same process.
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    command_line->AppendSwitch(switches::kProcessPerSite);
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
119868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  void CheckState(WebContents* tab,
120868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                  content::SecurityStyle expected_security_style,
121868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                  bool expected_displayed_insecure_content,
122868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                  bool expected_ran_insecure_content) {
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_FALSE(tab->IsCrashed());
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NavigationEntry* entry = tab->GetController().GetActiveEntry();
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(entry);
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(content::PAGE_TYPE_NORMAL, entry->GetPageType());
127868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    EXPECT_EQ(expected_security_style, entry->GetSSL().security_style);
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0U, entry->GetSSL().cert_status & net::CERT_STATUS_ALL_ERRORS);
129868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    bool displayed_insecure_content =
130868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        entry->GetSSL().content_status & SSLStatus::DISPLAYED_INSECURE_CONTENT;
131868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    EXPECT_EQ(expected_displayed_insecure_content, displayed_insecure_content);
132868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    bool ran_insecure_content =
133868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        entry->GetSSL().content_status & SSLStatus::RAN_INSECURE_CONTENT;
134868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    EXPECT_EQ(expected_ran_insecure_content, ran_insecure_content);
135868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
136868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
137868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  void CheckAuthenticatedState(WebContents* tab,
138868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                               bool expected_displayed_insecure_content) {
139868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    CheckState(tab, content::SECURITY_STYLE_AUTHENTICATED,
140868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)               expected_displayed_insecure_content, false);
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CheckUnauthenticatedState(WebContents* tab) {
144868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    CheckState(tab, content::SECURITY_STYLE_UNAUTHENTICATED, false, false);
145868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
146868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
147868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  void CheckBrokenAuthenticatedState(WebContents* tab) {
148868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    CheckState(tab, content::SECURITY_STYLE_AUTHENTICATION_BROKEN, false, true);
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CheckAuthenticationBrokenState(WebContents* tab,
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      net::CertStatus error,
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      bool ran_insecure_content,
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      bool interstitial) {
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_FALSE(tab->IsCrashed());
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NavigationEntry* entry = tab->GetController().GetActiveEntry();
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(entry);
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(interstitial ?
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  content::PAGE_TYPE_INTERSTITIAL : content::PAGE_TYPE_NORMAL,
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              entry->GetPageType());
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(content::SECURITY_STYLE_AUTHENTICATION_BROKEN,
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              entry->GetSSL().security_style);
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // CERT_STATUS_UNABLE_TO_CHECK_REVOCATION doesn't lower the security style
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // to SECURITY_STYLE_AUTHENTICATION_BROKEN.
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_NE(net::CERT_STATUS_UNABLE_TO_CHECK_REVOCATION, error);
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(error, entry->GetSSL().cert_status & error);
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(!!(entry->GetSSL().content_status &
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    SSLStatus::DISPLAYED_INSECURE_CONTENT));
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ran_insecure_content,
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        !!(entry->GetSSL().content_status & SSLStatus::RAN_INSECURE_CONTENT));
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    net::CertStatus extra_cert_errors = error ^ (entry->GetSSL().cert_status &
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                 net::CERT_STATUS_ALL_ERRORS);
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (extra_cert_errors)
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      LOG(WARNING) << "Got unexpected cert error: " << extra_cert_errors;
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
177868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  void CheckWorkerLoadResult(WebContents* tab, bool expected_load) {
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Workers are async and we don't have notifications for them passing
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // messages since they do it between renderer and worker processes.
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // So have a polling loop, check every 200ms, timeout at 30s.
181868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    const int kTimeoutMS = 200;
182868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    base::Time time_to_quit = base::Time::Now() +
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::TimeDelta::FromMilliseconds(30000);
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    while (base::Time::Now() < time_to_quit) {
186868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      bool worker_finished = false;
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ASSERT_TRUE(content::ExecuteScriptAndExtractBool(
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          tab,
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          "window.domAutomationController.send(IsWorkerFinished());",
190868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)          &worker_finished));
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
192868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      if (worker_finished)
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Wait a bit.
19690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      base::MessageLoop::current()->PostDelayedTask(
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          FROM_HERE,
19890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          base::MessageLoop::QuitClosure(),
199868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)          base::TimeDelta::FromMilliseconds(kTimeoutMS));
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::RunMessageLoop();
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
203868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    bool actually_loaded_content = false;
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_TRUE(content::ExecuteScriptAndExtractBool(
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        tab,
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "window.domAutomationController.send(IsContentLoaded());",
207868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        &actually_loaded_content));
208868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    EXPECT_EQ(expected_load, actually_loaded_content);
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ProceedThroughInterstitial(WebContents* tab) {
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    InterstitialPage* interstitial_page = tab->GetInterstitialPage();
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(interstitial_page);
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::WindowedNotificationObserver observer(
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::NOTIFICATION_LOAD_STOP,
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::Source<NavigationController>(&tab->GetController()));
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    interstitial_page->Proceed();
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    observer.Wait();
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool IsShowingWebContentsModalDialog() const {
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return WebContentsModalDialogManager::FromWebContents(
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        browser()->tab_strip_model()->GetActiveWebContents())->
2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            IsShowingDialog();
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static bool GetFilePathWithHostAndPortReplacement(
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::string& original_file_path,
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const net::HostPortPair& host_port_pair,
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::string* replacement_path) {
231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    std::vector<net::SpawnedTestServer::StringPair> replacement_text;
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    replacement_text.push_back(
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        make_pair("REPLACE_WITH_HOST_AND_PORT", host_port_pair.ToString()));
234c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return net::SpawnedTestServer::GetFilePathWithReplacements(
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        original_file_path, replacement_text, replacement_path);
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
238c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  static bool GetTopFramePath(const net::SpawnedTestServer& http_server,
239c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                              const net::SpawnedTestServer& good_https_server,
240c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                              const net::SpawnedTestServer& bad_https_server,
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              std::string* top_frame_path) {
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The "frame_left.html" page contained in the top_frame.html page contains
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // <a href>'s to three different servers. This sets up all of the
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // replacement text to work with test servers which listen on ephemeral
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // ports.
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GURL http_url = http_server.GetURL("files/ssl/google.html");
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GURL good_https_url = good_https_server.GetURL("files/ssl/google.html");
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GURL bad_https_url = bad_https_server.GetURL(
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "files/ssl/bad_iframe.html");
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
251c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    std::vector<net::SpawnedTestServer::StringPair> replacement_text_frame_left;
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    replacement_text_frame_left.push_back(
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        make_pair("REPLACE_WITH_HTTP_PAGE", http_url.spec()));
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    replacement_text_frame_left.push_back(
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        make_pair("REPLACE_WITH_GOOD_HTTPS_PAGE", good_https_url.spec()));
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    replacement_text_frame_left.push_back(
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        make_pair("REPLACE_WITH_BAD_HTTPS_PAGE", bad_https_url.spec()));
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string frame_left_path;
259c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (!net::SpawnedTestServer::GetFilePathWithReplacements(
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "frame_left.html",
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            replacement_text_frame_left,
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            &frame_left_path))
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Substitute the generated frame_left URL into the top_frame page.
266c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    std::vector<net::SpawnedTestServer::StringPair> replacement_text_top_frame;
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    replacement_text_top_frame.push_back(
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        make_pair("REPLACE_WITH_FRAME_LEFT_PATH", frame_left_path));
269c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return net::SpawnedTestServer::GetFilePathWithReplacements(
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "files/ssl/top_frame.html",
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        replacement_text_top_frame,
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        top_frame_path);
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static bool GetPageWithUnsafeWorkerPath(
276c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      const net::SpawnedTestServer& expired_https_server,
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::string* page_with_unsafe_worker_path) {
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Get the "imported.js" URL from the expired https server and
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // substitute it into the unsafe_worker.js file.
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GURL imported_js_url = expired_https_server.GetURL("files/ssl/imported.js");
281c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    std::vector<net::SpawnedTestServer::StringPair>
282c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        replacement_text_for_unsafe_worker;
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    replacement_text_for_unsafe_worker.push_back(
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        make_pair("REPLACE_WITH_IMPORTED_JS_URL", imported_js_url.spec()));
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string unsafe_worker_path;
286c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (!net::SpawnedTestServer::GetFilePathWithReplacements(
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "unsafe_worker.js",
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        replacement_text_for_unsafe_worker,
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        &unsafe_worker_path))
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Now, substitute this into the page with unsafe worker.
293c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    std::vector<net::SpawnedTestServer::StringPair>
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        replacement_text_for_page_with_unsafe_worker;
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    replacement_text_for_page_with_unsafe_worker.push_back(
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        make_pair("REPLACE_WITH_UNSAFE_WORKER_PATH", unsafe_worker_path));
297c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return net::SpawnedTestServer::GetFilePathWithReplacements(
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "files/ssl/page_with_unsafe_worker.html",
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        replacement_text_for_page_with_unsafe_worker,
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        page_with_unsafe_worker_path);
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
303c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  net::SpawnedTestServer https_server_;
304c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  net::SpawnedTestServer https_server_expired_;
305c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  net::SpawnedTestServer https_server_mismatched_;
306c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  net::SpawnedTestServer wss_server_expired_;
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
309c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  typedef net::SpawnedTestServer::SSLOptions SSLOptions;
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(SSLUITest);
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SSLUITestBlock : public SSLUITest {
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SSLUITestBlock() : SSLUITest() {}
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Browser will neither run nor display insecure content.
3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    command_line->AppendSwitch(switches::kNoDisplayingInsecureContent);
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SSLUITestIgnoreCertErrors : public SSLUITest {
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SSLUITestIgnoreCertErrors() : SSLUITest() {}
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Browser will ignore certificate errors.
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    command_line->AppendSwitch(switches::kIgnoreCertificateErrors);
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Visits a regular page over http.
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SSLUITest, TestHTTP) {
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(),
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               test_server()->GetURL("files/ssl/google.html"));
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CheckUnauthenticatedState(
3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->tab_strip_model()->GetActiveWebContents());
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Visits a page over http which includes broken https resources (status should
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// be OK).
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(jcampan): test that bad HTTPS content is blocked (otherwise we'll give
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//                the secure cookies away!).
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SSLUITest, TestHTTPWithBrokenHTTPSResource) {
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(https_server_expired_.Start());
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string replacement_path;
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetFilePathWithHostAndPortReplacement(
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "files/ssl/page_with_unsafe_contents.html",
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      https_server_expired_.host_port_pair(),
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &replacement_path));
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      browser(), test_server()->GetURL(replacement_path));
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CheckUnauthenticatedState(
3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->tab_strip_model()->GetActiveWebContents());
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://crbug.com/91745
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS)
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_TestOKHTTPS DISABLED_TestOKHTTPS
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_TestOKHTTPS TestOKHTTPS
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Visits a page over OK https:
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SSLUITest, MAYBE_TestOKHTTPS) {
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(https_server_.Start());
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(),
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               https_server_.GetURL("files/ssl/google.html"));
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CheckAuthenticatedState(
3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->tab_strip_model()->GetActiveWebContents(), false);
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Visits a page with https error and proceed:
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SSLUITest, TestHTTPSExpiredCertAndProceed) {
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(https_server_expired_.Start());
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(),
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      https_server_expired_.GetURL("files/ssl/google.html"));
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents();
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckAuthenticationBrokenState(tab, net::CERT_STATUS_DATE_INVALID, false,
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 true);  // Interstitial showing
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProceedThroughInterstitial(tab);
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckAuthenticationBrokenState(tab, net::CERT_STATUS_DATE_INVALID, false,
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 false);  // No interstitial showing
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
401a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#if defined(OS_WIN)
402a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Flaky on Windows (http://crbug.com/267653).
403a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#define MAYBE_TestHTTPSExpiredCertAndDontProceed \
404a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        DISABLED_TestHTTPSExpiredCertAndDontProceed
405a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#else
406a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#define MAYBE_TestHTTPSExpiredCertAndDontProceed \
407a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        TestHTTPSExpiredCertAndDontProceed
408a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#endif
409a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Visits a page with https error and don't proceed (and ensure we can still
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// navigate at that point):
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SSLUITest, TestHTTPSExpiredCertAndDontProceed) {
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(https_server_.Start());
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(https_server_expired_.Start());
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // First navigate to an OK page.
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(),
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               https_server_.GetURL("files/ssl/google.html"));
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents();
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NavigationEntry* entry = tab->GetController().GetActiveEntry();
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(entry);
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL cross_site_url =
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      https_server_expired_.GetURL("files/ssl/google.html");
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Change the host name from 127.0.0.1 to localhost so it triggers a
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // cross-site navigation so we can test http://crbug.com/5800 is gone.
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ("127.0.0.1", cross_site_url.host());
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL::Replacements replacements;
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string new_host("localhost");
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  replacements.SetHostStr(new_host);
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cross_site_url = cross_site_url.ReplaceComponents(replacements);
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now go to a bad HTTPS page.
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), cross_site_url);
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // An interstitial should be showing.
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckAuthenticationBrokenState(tab, net::CERT_STATUS_COMMON_NAME_INVALID,
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 false, true);
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulate user clicking "Take me back".
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InterstitialPage* interstitial_page = tab->GetInterstitialPage();
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(interstitial_page);
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  interstitial_page->DontProceed();
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We should be back to the original good page.
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckAuthenticatedState(tab, false);
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Try to navigate to a new page. (to make sure bug 5800 is fixed).
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(),
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               test_server()->GetURL("files/ssl/google.html"));
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckUnauthenticatedState(tab);
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Visits a page with https error and then goes back using Browser::GoBack.
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SSLUITest,
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       TestHTTPSExpiredCertAndGoBackViaButton) {
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(https_server_expired_.Start());
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // First navigate to an HTTP page.
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(),
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_server()->GetURL("files/ssl/google.html"));
4652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents();
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NavigationEntry* entry = tab->GetController().GetActiveEntry();
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(entry);
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now go to a bad HTTPS page that shows an interstitial.
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(),
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      https_server_expired_.GetURL("files/ssl/google.html"));
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckAuthenticationBrokenState(tab, net::CERT_STATUS_DATE_INVALID, false,
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 true);  // Interstitial showing
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProvisionalLoadWaiter load_failed_observer(tab);
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulate user clicking on back button (crbug.com/39248).
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::GoBack(browser(), CURRENT_TAB);
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Wait until we hear the load failure, and make sure we haven't swapped out
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the previous page.  Prevents regression of http://crbug.com/82667.
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  load_failed_observer.Wait();
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(content::RenderViewHostTester::IsRenderViewHostSwappedOut(
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      tab->GetRenderViewHost()));
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We should be back at the original good page.
4872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(browser()->tab_strip_model()->GetActiveWebContents()->
4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   GetInterstitialPage());
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckUnauthenticatedState(tab);
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Visits a page with https error and then goes back using GoToOffset.
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Disabled because its flaky: http://crbug.com/40932, http://crbug.com/43575.
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SSLUITest,
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       TestHTTPSExpiredCertAndGoBackViaMenu) {
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(https_server_expired_.Start());
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // First navigate to an HTTP page.
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(),
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_server()->GetURL("files/ssl/google.html"));
5022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents();
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NavigationEntry* entry = tab->GetController().GetActiveEntry();
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(entry);
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now go to a bad HTTPS page that shows an interstitial.
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(),
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      https_server_expired_.GetURL("files/ssl/google.html"));
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckAuthenticationBrokenState(tab, net::CERT_STATUS_DATE_INVALID, false,
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 true);  // Interstitial showing
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulate user clicking and holding on back button (crbug.com/37215).
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  tab->GetController().GoToOffset(-1);
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We should be back at the original good page.
5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(browser()->tab_strip_model()->GetActiveWebContents()->
5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   GetInterstitialPage());
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckUnauthenticatedState(tab);
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Visits a page with https error and then goes forward using GoToOffset.
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SSLUITest, TestHTTPSExpiredCertAndGoForward) {
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(https_server_expired_.Start());
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // First navigate to two HTTP pages.
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(),
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_server()->GetURL("files/ssl/google.html"));
5292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents();
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NavigationEntry* entry1 = tab->GetController().GetActiveEntry();
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(entry1);
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(),
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_server()->GetURL("files/ssl/blank_page.html"));
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NavigationEntry* entry2 = tab->GetController().GetActiveEntry();
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(entry2);
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now go back so that a page is in the forward history.
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::WindowedNotificationObserver observer(
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::NOTIFICATION_LOAD_STOP,
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::Source<NavigationController>(&tab->GetController()));
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tab->GetController().GoBack();
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    observer.Wait();
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(tab->GetController().CanGoForward());
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NavigationEntry* entry3 = tab->GetController().GetActiveEntry();
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(entry1 == entry3);
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now go to a bad HTTPS page that shows an interstitial.
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(),
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      https_server_expired_.GetURL("files/ssl/google.html"));
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckAuthenticationBrokenState(tab, net::CERT_STATUS_DATE_INVALID, false,
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 true);  // Interstitial showing
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulate user clicking and holding on forward button.
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::WindowedNotificationObserver observer(
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::NOTIFICATION_LOAD_STOP,
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::Source<NavigationController>(&tab->GetController()));
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tab->GetController().GoToOffset(1);
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    observer.Wait();
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We should be showing the second good page.
5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(browser()->tab_strip_model()->GetActiveWebContents()->
5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   GetInterstitialPage());
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckUnauthenticatedState(tab);
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(tab->GetController().CanGoForward());
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NavigationEntry* entry4 = tab->GetController().GetActiveEntry();
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(entry2 == entry4);
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Visit a HTTP page which request WSS connection to a server providing invalid
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// certificate. Close the page while WSS connection waits for SSLManager's
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// response from UI thread.
5762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Disabled on Windows because it was flaking on XP Tests (1). crbug.com/165258
5772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN)
5782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_TestWSSInvalidCertAndClose DISABLED_TestWSSInvalidCertAndClose
5792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_TestWSSInvalidCertAndClose TestWSSInvalidCertAndClose
5812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
5822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(SSLUITest, MAYBE_TestWSSInvalidCertAndClose) {
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(wss_server_expired_.Start());
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Setup page title observer.
5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents();
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::TitleWatcher watcher(tab, ASCIIToUTF16("PASS"));
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  watcher.AlsoWaitForTitle(ASCIIToUTF16("FAIL"));
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create GURLs to test pages.
592868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  std::string master_url_path = base::StringPrintf("%s?%d",
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_server()->GetURL("files/ssl/wss_close.html").spec().c_str(),
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      wss_server_expired_.host_port_pair().port());
595868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  GURL master_url(master_url_path);
596868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  std::string slave_url_path = base::StringPrintf("%s?%d",
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_server()->GetURL("files/ssl/wss_close_slave.html").spec().c_str(),
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      wss_server_expired_.host_port_pair().port());
599868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  GURL slave_url(slave_url_path);
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create tabs and visit pages which keep on creating wss connections.
6022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* tabs[16];
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < 16; ++i) {
604868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    tabs[i] = chrome::AddSelectedTabWithURL(browser(), slave_url,
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            content::PAGE_TRANSITION_LINK);
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::SelectNextTab(browser());
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Visit a page which waits for one TLS handshake failure.
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The title will be changed to 'PASS'.
611868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), master_url);
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const string16 result = watcher.WaitAndGetTitle();
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(LowerCaseEqualsASCII(result, "pass"));
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Close tabs which contains the test page.
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < 16; ++i)
6172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    chrome::CloseWebContents(browser(), tabs[i], false);
6182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  chrome::CloseWebContents(browser(), tab, false);
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Visit a HTTPS page and proceeds despite an invalid certificate. The page
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// requests WSS connection to the same origin host to check if WSS connection
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// share certificates policy with HTTPS correcly.
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SSLUITest, TestWSSInvalidCertAndGoForward) {
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(wss_server_expired_.Start());
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Setup page title observer.
6292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents();
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::TitleWatcher watcher(tab, ASCIIToUTF16("PASS"));
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  watcher.AlsoWaitForTitle(ASCIIToUTF16("FAIL"));
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Visit bad HTTPS page.
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string scheme("https");
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL::Replacements replacements;
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  replacements.SetSchemeStr(scheme);
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      browser(),
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      wss_server_expired_.GetURL(
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          "connect_check.html").ReplaceComponents(replacements));
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckAuthenticationBrokenState(tab, net::CERT_STATUS_DATE_INVALID, false,
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 true);  // Interstitial showing
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Proceed anyway.
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProceedThroughInterstitial(tab);
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test page run a WebSocket wss connection test. The result will be shown
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // as page title.
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const string16 result = watcher.WaitAndGetTitle();
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(LowerCaseEqualsASCII(result, "pass"));
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_NSS)
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// SSL client certificate tests are only enabled when using NSS for private key
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// storage, as only NSS can avoid modifying global machine state when testing.
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// See http://crbug.com/51132
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Visit a HTTPS page which requires client cert authentication. The client
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// cert will be selected automatically, then a test which uses WebSocket runs.
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Disabled:  http://crbug.com/159985
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SSLUITest, DISABLED_TestWSSClientCert) {
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Open a temporary NSS DB for testing.
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  crypto::ScopedTestNSSDB test_nssdb;
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_nssdb.is_open());
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Import client cert for test. These interfaces require NSS.
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::NSSCertDatabase* cert_db = net::NSSCertDatabase::GetInstance();
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<net::CryptoModule> crypt_module = cert_db->GetPublicModule();
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string pkcs12_data;
6702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath cert_path = net::GetTestCertsDirectory().Append(
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FILE_PATH_LITERAL("websocket_client_cert.p12"));
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(file_util::ReadFileToString(cert_path, &pkcs12_data));
673868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(net::OK,
674868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            cert_db->ImportFromPKCS12(
675868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                crypt_module.get(), pkcs12_data, string16(), true, NULL));
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Start WebSocket test server with TLS and client cert authentication.
678c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  net::SpawnedTestServer::SSLOptions options(
679c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      net::SpawnedTestServer::SSLOptions::CERT_OK);
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  options.request_client_certificate = true;
6812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath ca_path = net::GetTestCertsDirectory().Append(
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FILE_PATH_LITERAL("websocket_cacert.pem"));
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  options.client_authorities.push_back(ca_path);
684c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  net::SpawnedTestServer wss_server(net::SpawnedTestServer::TYPE_WSS,
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             options,
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             net::GetWebSocketTestDataDirectory());
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(wss_server.Start());
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string scheme("https");
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL::Replacements replacements;
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  replacements.SetSchemeStr(scheme);
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url = wss_server.GetURL("connect_check.html").ReplaceComponents(
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      replacements);
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Setup page title observer.
6952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents();
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::TitleWatcher watcher(tab, ASCIIToUTF16("PASS"));
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  watcher.AlsoWaitForTitle(ASCIIToUTF16("FAIL"));
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add an entry into AutoSelectCertificateForUrls policy for automatic client
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // cert selection.
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Profile* profile = Profile::FromBrowserContext(tab->GetBrowserContext());
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(profile);
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<DictionaryValue> dict(new DictionaryValue());
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dict->SetString("ISSUER.CN", "pywebsocket");
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile->GetHostContentSettingsMap()->SetWebsiteSetting(
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ContentSettingsPattern::FromURL(url),
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ContentSettingsPattern::FromURL(url),
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CONTENT_SETTINGS_TYPE_AUTO_SELECT_CERTIFICATE,
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::string(),
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dict.release());
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Visit a HTTPS page which requires client certs.
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), url);
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckAuthenticatedState(tab, false);
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test page runs a WebSocket wss connection test. The result will be shown
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // as page title.
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const string16 result = watcher.WaitAndGetTitle();
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(LowerCaseEqualsASCII(result, "pass"));
7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // defined(USE_NSS)
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Flaky on CrOS http://crbug.com/92292
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS)
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_TestHTTPSErrorWithNoNavEntry \
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DISABLED_TestHTTPSErrorWithNoNavEntry
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_TestHTTPSErrorWithNoNavEntry TestHTTPSErrorWithNoNavEntry
7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // defined(OS_CHROMEOS)
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Open a page with a HTTPS error in a tab with no prior navigation (through a
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// link with a blank target).  This is to test that the lack of navigation entry
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// does not cause any problems (it was causing a crasher, see
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://crbug.com/19941).
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SSLUITest, MAYBE_TestHTTPSErrorWithNoNavEntry) {
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(https_server_expired_.Start());
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url = https_server_expired_.GetURL("files/ssl/google.htm");
7392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* tab2 = chrome::AddSelectedTabWithURL(
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      browser(), url, content::PAGE_TRANSITION_TYPED);
7412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  content::WaitForLoadStop(tab2);
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify our assumption that there was no prior navigation.
7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(chrome::CanGoBack(browser()));
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We should have an interstitial page showing.
7472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(tab2->GetInterstitialPage());
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SSLUITest, TestBadHTTPSDownload) {
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(https_server_expired_.Start());
753c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GURL url_non_dangerous = test_server()->GetURL(std::string());
754c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GURL url_dangerous =
755c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      https_server_expired_.GetURL("files/downloads/dangerous/dangerous.exe");
7562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::ScopedTempDir downloads_directory_;
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Need empty temp dir to avoid having Chrome ask us for a new filename
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // when we've downloaded dangerous.exe one hundred times.
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(downloads_directory_.CreateUniqueTempDir());
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  browser()->profile()->GetPrefs()->SetFilePath(
7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      prefs::kDownloadDefaultDirectory,
7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      downloads_directory_.path());
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Visit a non-dangerous page.
7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), url_non_dangerous);
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now, start a transition to dangerous download.
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::WindowedNotificationObserver observer(
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::NOTIFICATION_LOAD_STOP,
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::NotificationService::AllSources());
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    chrome::NavigateParams navigate_params(browser(), url_dangerous,
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           content::PAGE_TRANSITION_TYPED);
7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    chrome::Navigate(&navigate_params);
7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    observer.Wait();
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // To exit the browser cleanly (and this test) we need to complete the
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // download after completing this test.
7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::DownloadTestObserverTerminal dangerous_download_observer(
7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::BrowserContext::GetDownloadManager(browser()->profile()),
7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      1,
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::DownloadTestObserver::ON_DANGEROUS_DOWNLOAD_ACCEPT);
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Proceed through the SSL interstitial. This doesn't use
7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |ProceedThroughInterstitial| since no page load will commit.
7892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents();
7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(tab != NULL);
7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(tab->GetInterstitialPage() != NULL);
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::WindowedNotificationObserver observer(
7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        chrome::NOTIFICATION_DOWNLOAD_INITIATED,
7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::NotificationService::AllSources());
7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tab->GetInterstitialPage()->Proceed();
7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    observer.Wait();
7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // There should still be an interstitial at this point. Press the
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // back button on the browser. Note that this doesn't wait for a
8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // NAV_ENTRY_COMMITTED notification because going back with an
8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // active interstitial simply hides the interstitial.
8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(tab->GetInterstitialPage() != NULL);
8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(chrome::CanGoBack(browser()));
8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::GoBack(browser(), CURRENT_TAB);
8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dangerous_download_observer.WaitForFinished();
8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Insecure content
8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://crbug.com/152940 Flaky on win.
8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_TestDisplaysInsecureContent DISABLED_TestDisplaysInsecureContent
8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_TestDisplaysInsecureContent TestDisplaysInsecureContent
8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Visits a page that displays insecure content.
8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SSLUITest, MAYBE_TestDisplaysInsecureContent) {
8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(https_server_.Start());
8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string replacement_path;
8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetFilePathWithHostAndPortReplacement(
8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "files/ssl/page_displays_insecure_content.html",
8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_server()->host_port_pair(),
8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &replacement_path));
8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Load a page that displays insecure content.
8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(),
8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               https_server_.GetURL(replacement_path));
8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CheckAuthenticatedState(
8382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->tab_strip_model()->GetActiveWebContents(), true);
8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Visits a page that runs insecure content and tries to suppress the insecure
8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// content warnings by randomizing location.hash.
8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Based on http://crbug.com/8706
8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SSLUITest,
8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       TestRunsInsecuredContentRandomizeHash) {
8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(https_server_.Start());
8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), https_server_.GetURL(
8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "files/ssl/page_runs_insecure_content.html"));
8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CheckAuthenticationBrokenState(
8532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->tab_strip_model()->GetActiveWebContents(), 0, true, false);
8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Visits a page with unsafe content and make sure that:
8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - frames content is replaced with warning
8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - images and scripts are filtered out entirely
8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SSLUITest, TestUnsafeContents) {
8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(https_server_.Start());
8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(https_server_expired_.Start());
8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string replacement_path;
8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetFilePathWithHostAndPortReplacement(
8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "files/ssl/page_with_unsafe_contents.html",
8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      https_server_expired_.host_port_pair(),
8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &replacement_path));
8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(),
8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               https_server_.GetURL(replacement_path));
8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents();
8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // When the bad content is filtered, the state is expected to be
8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // authenticated.
8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckAuthenticatedState(tab, false);
8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Because of cross-frame scripting restrictions, we cannot access the iframe
8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // content.  So to know if the frame was loaded, we just check if a popup was
8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // opened (the iframe content opens one).
8792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Note: because of bug 1115868, no web contents modal dialog is opened right
8802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //       now.  Once the bug is fixed, this will do the real check.
8812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(IsShowingWebContentsModalDialog());
8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int img_width;
8842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(content::ExecuteScriptAndExtractInt(
8852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      tab,
8862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "window.domAutomationController.send(ImageWidth());",
8872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &img_width));
8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // In order to check that the image was not loaded, we check its width.
8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The actual image (Google logo) is 114 pixels wide, we assume the broken
8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // image is less than 100.
8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_LT(img_width, 100);
8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool js_result = false;
8942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(content::ExecuteScriptAndExtractBool(
8952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      tab,
8962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "window.domAutomationController.send(IsFooSet());",
8972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &js_result));
8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(js_result);
8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Visits a page with insecure content loaded by JS (after the initial page
9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// load).
9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SSLUITest, TestDisplaysInsecureContentLoadedFromJS) {
9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(https_server_.Start());
9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string replacement_path;
9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetFilePathWithHostAndPortReplacement(
9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "files/ssl/page_with_dynamic_insecure_content.html",
9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_server()->host_port_pair(),
9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &replacement_path));
9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), https_server_.GetURL(
9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      replacement_path));
9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents();
9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckAuthenticatedState(tab, false);
9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Load the insecure image.
9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool js_result = false;
9202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(content::ExecuteScriptAndExtractBool(
9212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      tab,
9222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "loadBadImage();",
9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &js_result));
9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(js_result);
9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We should now have insecure content.
9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckAuthenticatedState(tab, true);
9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Visits two pages from the same origin: one that displays insecure content and
9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// one that doesn't.  The test checks that we do not propagate the insecure
9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// content state from one to the other.
9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SSLUITest, TestDisplaysInsecureContentTwoTabs) {
9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(https_server_.Start());
9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(),
9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      https_server_.GetURL("files/ssl/blank_page.html"));
9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* tab1 = browser()->tab_strip_model()->GetActiveWebContents();
9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This tab should be fine.
9432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CheckAuthenticatedState(tab1, false);
9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create a new tab.
9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string replacement_path;
9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetFilePathWithHostAndPortReplacement(
9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "files/ssl/page_displays_insecure_content.html",
9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_server()->host_port_pair(),
9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &replacement_path));
9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url = https_server_.GetURL(replacement_path);
9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::NavigateParams params(browser(), url, content::PAGE_TRANSITION_TYPED);
9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params.disposition = NEW_FOREGROUND_TAB;
9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params.tabstrip_index = 0;
9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params.source_contents = tab1;
9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::WindowedNotificationObserver observer(
9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::NOTIFICATION_LOAD_STOP,
9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::NotificationService::AllSources());
9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::Navigate(&params);
9612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* tab2 = params.target_contents;
9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  observer.Wait();
9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The new tab has insecure content.
9652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CheckAuthenticatedState(tab2, true);
9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The original tab should not be contaminated.
9682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CheckAuthenticatedState(tab1, false);
9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Visits two pages from the same origin: one that runs insecure content and one
9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// that doesn't.  The test checks that we propagate the insecure content state
9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// from one to the other.
9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SSLUITest, TestRunsInsecureContentTwoTabs) {
9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(https_server_.Start());
9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(),
9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      https_server_.GetURL("files/ssl/blank_page.html"));
9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* tab1 = browser()->tab_strip_model()->GetActiveWebContents();
9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This tab should be fine.
9842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CheckAuthenticatedState(tab1, false);
9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string replacement_path;
9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetFilePathWithHostAndPortReplacement(
9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "files/ssl/page_runs_insecure_content.html",
9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_server()->host_port_pair(),
9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &replacement_path));
9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create a new tab in the same process.  Using a NEW_FOREGROUND_TAB
9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // disposition won't usually stay in the same process, but this works
9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // because we are using process-per-site in SetUpCommandLine.
9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url = https_server_.GetURL(replacement_path);
9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::NavigateParams params(browser(), url, content::PAGE_TRANSITION_TYPED);
9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params.disposition = NEW_FOREGROUND_TAB;
9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params.source_contents = tab1;
9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::WindowedNotificationObserver observer(
10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::NOTIFICATION_LOAD_STOP,
10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::NotificationService::AllSources());
10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::Navigate(&params);
10032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* tab2 = params.target_contents;
10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  observer.Wait();
10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Both tabs should have the same process.
1007868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(tab1->GetRenderProcessHost(), tab2->GetRenderProcessHost());
10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The new tab has insecure content.
10102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CheckAuthenticationBrokenState(tab2, 0, true, false);
10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Which means the origin for the first tab has also been contaminated with
10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // insecure content.
10142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CheckAuthenticationBrokenState(tab1, 0, true, false);
10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Visits a page with an image over http.  Visits another page over https
10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// referencing that same image over http (hoping it is coming from the webcore
10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// memory cache).
10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SSLUITest, TestDisplaysCachedInsecureContent) {
10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(https_server_.Start());
10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string replacement_path;
10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetFilePathWithHostAndPortReplacement(
10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "files/ssl/page_displays_insecure_content.html",
10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_server()->host_port_pair(),
10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &replacement_path));
10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Load original page over HTTP.
10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GURL url_http = test_server()->GetURL(replacement_path);
10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), url_http);
10332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents();
10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckUnauthenticatedState(tab);
10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Load again but over SSL.  It should be marked as displaying insecure
10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // content (even though the image comes from the WebCore memory cache).
10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GURL url_https = https_server_.GetURL(replacement_path);
10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), url_https);
10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckAuthenticatedState(tab, true);
10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://crbug.com/84729
10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS)
10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_TestRunsCachedInsecureContent \
10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DISABLED_TestRunsCachedInsecureContent
10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_TestRunsCachedInsecureContent TestRunsCachedInsecureContent
10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // defined(OS_CHROMEOS)
10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Visits a page with script over http.  Visits another page over https
10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// referencing that same script over http (hoping it is coming from the webcore
10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// memory cache).
10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SSLUITest, MAYBE_TestRunsCachedInsecureContent) {
10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(https_server_.Start());
10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string replacement_path;
10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetFilePathWithHostAndPortReplacement(
10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "files/ssl/page_runs_insecure_content.html",
10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_server()->host_port_pair(),
10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &replacement_path));
10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Load original page over HTTP.
10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GURL url_http = test_server()->GetURL(replacement_path);
10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), url_http);
10672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents();
10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckUnauthenticatedState(tab);
10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Load again but over SSL.  It should be marked as displaying insecure
10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // content (even though the image comes from the WebCore memory cache).
10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GURL url_https = https_server_.GetURL(replacement_path);
10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), url_https);
10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckAuthenticationBrokenState(tab, 0, true, false);
10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This test ensures the CN invalid status does not 'stick' to a certificate
10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// (see bug #1044942) and that it depends on the host-name.
10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SSLUITest, TestCNInvalidStickiness) {
10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(https_server_.Start());
10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(https_server_mismatched_.Start());
10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // First we hit the server with hostname, this generates an invalid policy
10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // error.
10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(),
10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      https_server_mismatched_.GetURL("files/ssl/google.html"));
10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We get an interstitial page as a result.
10892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents();
10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckAuthenticationBrokenState(tab, net::CERT_STATUS_COMMON_NAME_INVALID,
10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 false, true);  // Interstitial showing.
10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProceedThroughInterstitial(tab);
10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckAuthenticationBrokenState(tab, net::CERT_STATUS_COMMON_NAME_INVALID,
10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 false, false);  // No interstitial showing.
10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now we try again with the right host name this time.
10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url(https_server_.GetURL("files/ssl/google.html"));
10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), url);
10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Security state should be OK.
11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckAuthenticatedState(tab, false);
11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now try again the broken one to make sure it is still broken.
11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(),
11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      https_server_mismatched_.GetURL("files/ssl/google.html"));
11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Since we OKed the interstitial last time, we get right to the page.
11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckAuthenticationBrokenState(tab, net::CERT_STATUS_COMMON_NAME_INVALID,
11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 false, false);  // No interstitial showing.
11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS)
11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This test seems to be flaky and hang on chromiumos.
11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://crbug.com/84419
11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_TestRefNavigation DISABLED_TestRefNavigation
11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_TestRefNavigation TestRefNavigation
11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that navigating to a #ref does not change a bad security state.
11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SSLUITest, TestRefNavigation) {
11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(https_server_expired_.Start());
11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(),
11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      https_server_expired_.GetURL("files/ssl/page_with_refs.html"));
11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents();
11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckAuthenticationBrokenState(tab, net::CERT_STATUS_DATE_INVALID, false,
11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 true);  // Interstitial showing.
11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProceedThroughInterstitial(tab);
11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckAuthenticationBrokenState(tab, net::CERT_STATUS_DATE_INVALID, false,
11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 false);  // No interstitial showing.
11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now navigate to a ref in the page, the security state should not have
11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // changed.
11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(),
11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      https_server_expired_.GetURL("files/ssl/page_with_refs.html#jp"));
11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckAuthenticationBrokenState(tab, net::CERT_STATUS_DATE_INVALID, false,
11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 false);  // No interstitial showing.
11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that closing a page that has a unsafe pop-up does not crash the
11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// browser (bug #1966).
11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(jcampan): http://crbug.com/2136 disabled because the popup is not
11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//                opened as it is not initiated by a user gesture.
11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SSLUITest, DISABLED_TestCloseTabWithUnsafePopup) {
11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(https_server_expired_.Start());
11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string replacement_path;
11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetFilePathWithHostAndPortReplacement(
11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "files/ssl/page_with_unsafe_popup.html",
11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      https_server_expired_.host_port_pair(),
11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &replacement_path));
11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(),
11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               test_server()->GetURL(replacement_path));
11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* tab1 = browser()->tab_strip_model()->GetActiveWebContents();
11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // It is probably overkill to add a notification for a popup-opening, let's
11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // just poll.
11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < 10; i++) {
11662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (IsShowingWebContentsModalDialog())
11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
116890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->PostDelayedTask(
116990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        FROM_HERE,
117090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        base::MessageLoop::QuitClosure(),
117190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        base::TimeDelta::FromSeconds(1));
11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::RunMessageLoop();
11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(IsShowingWebContentsModalDialog());
11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Let's add another tab to make sure the browser does not exit when we close
11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the first tab.
11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url = test_server()->GetURL("files/ssl/google.html");
11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::WindowedNotificationObserver observer(
11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::NOTIFICATION_LOAD_STOP,
11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::NotificationService::AllSources());
11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::AddSelectedTabWithURL(browser(), url, content::PAGE_TRANSITION_TYPED);
11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  observer.Wait();
11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Close the first tab.
11862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  chrome::CloseWebContents(browser(), tab1, false);
11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Visit a page over bad https that is a redirect to a page with good https.
11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SSLUITest, TestRedirectBadToGoodHTTPS) {
11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(https_server_.Start());
11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(https_server_expired_.Start());
11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url1 = https_server_expired_.GetURL("server-redirect?");
11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url2 = https_server_.GetURL("files/ssl/google.html");
11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), GURL(url1.spec() + url2.spec()));
11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents();
12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckAuthenticationBrokenState(tab, net::CERT_STATUS_DATE_INVALID, false,
12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 true);  // Interstitial showing.
12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProceedThroughInterstitial(tab);
12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We have been redirected to the good page.
12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckAuthenticatedState(tab, false);
12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Visit a page over good https that is a redirect to a page with bad https.
12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SSLUITest, TestRedirectGoodToBadHTTPS) {
12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(https_server_.Start());
12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(https_server_expired_.Start());
12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url1 = https_server_.GetURL("server-redirect?");
12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url2 = https_server_expired_.GetURL("files/ssl/google.html");
12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), GURL(url1.spec() + url2.spec()));
12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents();
12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckAuthenticationBrokenState(tab, net::CERT_STATUS_DATE_INVALID, false,
12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 true);  // Interstitial showing.
12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProceedThroughInterstitial(tab);
12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckAuthenticationBrokenState(tab, net::CERT_STATUS_DATE_INVALID, false,
12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 false);  // No interstitial showing.
12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Visit a page over http that is a redirect to a page with good HTTPS.
12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SSLUITest, TestRedirectHTTPToGoodHTTPS) {
12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(https_server_.Start());
12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents();
12355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // HTTP redirects to good HTTPS.
12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL http_url = test_server()->GetURL("server-redirect?");
12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL good_https_url =
12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      https_server_.GetURL("files/ssl/google.html");
12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(),
12425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               GURL(http_url.spec() + good_https_url.spec()));
12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckAuthenticatedState(tab, false);
12445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Visit a page over http that is a redirect to a page with bad HTTPS.
12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SSLUITest, TestRedirectHTTPToBadHTTPS) {
12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(https_server_expired_.Start());
12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents();
12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL http_url = test_server()->GetURL("server-redirect?");
12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL bad_https_url =
12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      https_server_expired_.GetURL("files/ssl/google.html");
12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(),
12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               GURL(http_url.spec() + bad_https_url.spec()));
12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckAuthenticationBrokenState(tab, net::CERT_STATUS_DATE_INVALID, false,
12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 true);  // Interstitial showing.
12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProceedThroughInterstitial(tab);
12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckAuthenticationBrokenState(tab, net::CERT_STATUS_DATE_INVALID, false,
12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 false);  // No interstitial showing.
12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Visit a page over https that is a redirect to a page with http (to make sure
12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// we don't keep the secure state).
12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SSLUITest, TestRedirectHTTPSToHTTP) {
12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(https_server_.Start());
12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL https_url = https_server_.GetURL("server-redirect?");
12745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL http_url = test_server()->GetURL("files/ssl/google.html");
12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(),
12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               GURL(https_url.spec() + http_url.spec()));
12782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CheckUnauthenticatedState(
12792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->tab_strip_model()->GetActiveWebContents());
12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Visits a page to which we could not connect (bad port) over http and https
12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// and make sure the security style is correct.
12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SSLUITest, TestConnectToBadPort) {
12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), GURL("http://localhost:17"));
12862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CheckUnauthenticatedState(
12872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->tab_strip_model()->GetActiveWebContents());
12885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Same thing over HTTPS.
12905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), GURL("https://localhost:17"));
12912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CheckUnauthenticatedState(
12922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->tab_strip_model()->GetActiveWebContents());
12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
12965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Frame navigation
12975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// From a good HTTPS top frame:
13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - navigate to an OK HTTPS frame
13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - navigate to a bad HTTPS (expect unsafe content and filtered frame), then
13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   back
13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - navigate to HTTP (expect insecure content), then back
1304bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben MurdochIN_PROC_BROWSER_TEST_F(SSLUITest, TestGoodFrameNavigation) {
13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(https_server_.Start());
13075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(https_server_expired_.Start());
13085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string top_frame_path;
13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetTopFramePath(*test_server(),
13115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              https_server_,
13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              https_server_expired_,
13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              &top_frame_path));
13145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents();
13165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(),
13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               https_server_.GetURL(top_frame_path));
13185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckAuthenticatedState(tab, false);
13205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool success = false;
13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now navigate inside the frame.
13235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
13245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::WindowedNotificationObserver observer(
13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::NOTIFICATION_LOAD_STOP,
13265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::Source<NavigationController>(&tab->GetController()));
13272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(content::ExecuteScriptAndExtractBool(
13282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        tab,
13292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "window.domAutomationController.send(clickLink('goodHTTPSLink'));",
13305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        &success));
13315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(success);
13325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    observer.Wait();
13335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We should still be fine.
13365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckAuthenticatedState(tab, false);
13375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now let's hit a bad page.
13395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
13405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::WindowedNotificationObserver observer(
13415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::NOTIFICATION_LOAD_STOP,
13425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::Source<NavigationController>(&tab->GetController()));
13432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(content::ExecuteScriptAndExtractBool(
13442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        tab,
13452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "window.domAutomationController.send(clickLink('badHTTPSLink'));",
13465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        &success));
13475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(success);
13485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    observer.Wait();
13495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The security style should still be secure.
13525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckAuthenticatedState(tab, false);
13535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // And the frame should be blocked.
13555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_content_evil = true;
13562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string content_frame_xpath("html/frameset/frame[2]");
13572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string is_evil_js("window.domAutomationController.send("
13582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         "document.getElementById('evilDiv') != null);");
13592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(content::ExecuteScriptInFrameAndExtractBool(
13602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      tab,
13612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content_frame_xpath,
13622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      is_evil_js,
13635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &is_content_evil));
13645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(is_content_evil);
13655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now go back, our state should still be OK.
13675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
13685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::WindowedNotificationObserver observer(
13695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::NOTIFICATION_LOAD_STOP,
13705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::Source<NavigationController>(&tab->GetController()));
13715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tab->GetController().GoBack();
13725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    observer.Wait();
13735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckAuthenticatedState(tab, false);
13755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Navigate to a page served over HTTP.
13775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
13785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::WindowedNotificationObserver observer(
13795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::NOTIFICATION_LOAD_STOP,
13805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::Source<NavigationController>(&tab->GetController()));
13812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(content::ExecuteScriptAndExtractBool(
13822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        tab,
13832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "window.domAutomationController.send(clickLink('HTTPLink'));",
13845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        &success));
13855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(success);
13865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    observer.Wait();
13875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1389868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Our state should be unathenticated (in the ran mixed script sense)
1390868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  CheckBrokenAuthenticatedState(tab);
13915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Go back, our state should be unchanged.
13935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
13945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::WindowedNotificationObserver observer(
13955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::NOTIFICATION_LOAD_STOP,
13965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::Source<NavigationController>(&tab->GetController()));
13975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tab->GetController().GoBack();
13985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    observer.Wait();
13995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1400868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1401868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  CheckBrokenAuthenticatedState(tab);
14025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// From a bad HTTPS top frame:
14055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - navigate to an OK HTTPS frame (expected to be still authentication broken).
14065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SSLUITest, TestBadFrameNavigation) {
14075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(https_server_.Start());
14085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(https_server_expired_.Start());
14095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string top_frame_path;
14115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetTopFramePath(*test_server(),
14125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              https_server_,
14135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              https_server_expired_,
14145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              &top_frame_path));
14155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents();
14175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(),
14185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               https_server_expired_.GetURL(top_frame_path));
14195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckAuthenticationBrokenState(tab, net::CERT_STATUS_DATE_INVALID, false,
14205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 true);  // Interstitial showing
14215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProceedThroughInterstitial(tab);
14235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Navigate to a good frame.
14255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool success = false;
14265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::WindowedNotificationObserver observer(
14275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::NOTIFICATION_LOAD_STOP,
14285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::Source<NavigationController>(&tab->GetController()));
14292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(content::ExecuteScriptAndExtractBool(
14302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      tab,
14312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "window.domAutomationController.send(clickLink('goodHTTPSLink'));",
14325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &success));
14335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(success);
14345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  observer.Wait();
14355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We should still be authentication broken.
14375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckAuthenticationBrokenState(tab, net::CERT_STATUS_DATE_INVALID, false,
14385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 false);
14395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// From an HTTP top frame, navigate to good and bad HTTPS (security state should
14425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// stay unauthenticated).
14435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Disabled, flakily exceeds test timeout, http://crbug.com/43437.
14445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SSLUITest, DISABLED_TestUnauthenticatedFrameNavigation) {
14455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
14465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(https_server_.Start());
14475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(https_server_expired_.Start());
14485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string top_frame_path;
14505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetTopFramePath(*test_server(),
14515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              https_server_,
14525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              https_server_expired_,
14535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              &top_frame_path));
14545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents();
14565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(),
14575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               test_server()->GetURL(top_frame_path));
14585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckUnauthenticatedState(tab);
14595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now navigate inside the frame to a secure HTTPS frame.
14615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
14625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool success = false;
14635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::WindowedNotificationObserver observer(
14645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::NOTIFICATION_LOAD_STOP,
14655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::Source<NavigationController>(&tab->GetController()));
14662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(content::ExecuteScriptAndExtractBool(
14672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        tab,
14682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "window.domAutomationController.send(clickLink('goodHTTPSLink'));",
14695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        &success));
14705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(success);
14715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    observer.Wait();
14725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
14735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We should still be unauthenticated.
14755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckUnauthenticatedState(tab);
14765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now navigate to a bad HTTPS frame.
14785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
14795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool success = false;
14805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::WindowedNotificationObserver observer(
14815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::NOTIFICATION_LOAD_STOP,
14825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::Source<NavigationController>(&tab->GetController()));
14832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(content::ExecuteScriptAndExtractBool(
14842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        tab,
14852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "window.domAutomationController.send(clickLink('badHTTPSLink'));",
14865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        &success));
14875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(success);
14885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    observer.Wait();
14895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
14905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // State should not have changed.
14925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckUnauthenticatedState(tab);
14935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // And the frame should have been blocked (see bug #2316).
14955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_content_evil = true;
14962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string content_frame_xpath("html/frameset/frame[2]");
14972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string is_evil_js("window.domAutomationController.send("
14982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         "document.getElementById('evilDiv') != null);");
14992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(content::ExecuteScriptInFrameAndExtractBool(
15002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      tab,
15012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content_frame_xpath,
15022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      is_evil_js,
15035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &is_content_evil));
15045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(is_content_evil);
15055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SSLUITest, TestUnsafeContentsInWorkerFiltered) {
15085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(https_server_.Start());
15095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(https_server_expired_.Start());
15105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This page will spawn a Worker which will try to load content from
15125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // BadCertServer.
15135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string page_with_unsafe_worker_path;
15145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetPageWithUnsafeWorkerPath(https_server_expired_,
15155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          &page_with_unsafe_worker_path));
15165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), https_server_.GetURL(
15175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      page_with_unsafe_worker_path));
15182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents();
15195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Expect Worker not to load insecure content.
15205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckWorkerLoadResult(tab, false);
15215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The bad content is filtered, expect the state to be authenticated.
15225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckAuthenticatedState(tab, false);
15235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1525a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#if defined(OS_WIN)
1526a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Flaky on Windows (http://crbug.com/267653).
1527a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#define MAYBE_TestUnsafeContentsInWorker \
1528a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        DISABLED_TestUnsafeContentsInWorker
1529a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#else
1530a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#define MAYBE_TestUnsafeContentsInWorker \
1531a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        TestUnsafeContentsInWorker
1532a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#endif
1533a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
15345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SSLUITest, TestUnsafeContentsInWorker) {
15355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(https_server_.Start());
15365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(https_server_expired_.Start());
15375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Navigate to an unsafe site. Proceed with interstitial page to indicate
15395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the user approves the bad certificate.
15405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(),
15415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      https_server_expired_.GetURL("files/ssl/blank_page.html"));
15422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents();
15435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckAuthenticationBrokenState(tab, net::CERT_STATUS_DATE_INVALID, false,
15445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 true);  // Interstitial showing
15455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProceedThroughInterstitial(tab);
15465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckAuthenticationBrokenState(tab, net::CERT_STATUS_DATE_INVALID, false,
15475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 false);  // No Interstitial
15485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Navigate to safe page that has Worker loading unsafe content.
15505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Expect content to load but be marked as auth broken due to running insecure
15515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // content.
15525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string page_with_unsafe_worker_path;
15535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetPageWithUnsafeWorkerPath(https_server_expired_,
15545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          &page_with_unsafe_worker_path));
15555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), https_server_.GetURL(
15565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      page_with_unsafe_worker_path));
15575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckWorkerLoadResult(tab, true);  // Worker loads insecure content
15585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckAuthenticationBrokenState(tab, 0, true, false);
15595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that when the browser blocks displaying insecure content (images), the
15625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// indicator shows a secure page, because the blocking made the otherwise
15635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// unsafe page safe (the notification of this state is handled by other means).
15645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SSLUITestBlock, TestBlockDisplayingInsecureImage) {
15655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
15665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(https_server_.Start());
15675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string replacement_path;
15695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetFilePathWithHostAndPortReplacement(
15705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "files/ssl/page_displays_insecure_content.html",
15715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_server()->host_port_pair(),
15725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &replacement_path));
15735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(),
15755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               https_server_.GetURL(replacement_path));
15765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CheckAuthenticatedState(
15782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->tab_strip_model()->GetActiveWebContents(), false);
15795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1581a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#if defined(OS_WIN)
1582a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Flaky on Windows (http://crbug.com/267653).
1583a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#define MAYBE_TestBlockDisplayingInsecureIframe \
1584a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        DISABLED_TestBlockDisplayingInsecureIframe
1585a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#else
1586a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#define MAYBE_TestBlockDisplayingInsecureIframe \
1587a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        TestBlockDisplayingInsecureIframe
1588a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#endif
1589a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
15905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that when the browser blocks displaying insecure content (iframes), the
15915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// indicator shows a secure page, because the blocking made the otherwise
15925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// unsafe page safe (the notification of this state is handled by other means)
15935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SSLUITestBlock, TestBlockDisplayingInsecureIframe) {
15945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
15955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(https_server_.Start());
15965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string replacement_path;
15985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetFilePathWithHostAndPortReplacement(
15995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "files/ssl/page_displays_insecure_iframe.html",
16005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_server()->host_port_pair(),
16015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &replacement_path));
16025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(),
16045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               https_server_.GetURL(replacement_path));
16055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CheckAuthenticatedState(
16072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->tab_strip_model()->GetActiveWebContents(), false);
16085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that when the browser blocks running insecure content, the
16125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// indicator shows a secure page, because the blocking made the otherwise
16135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// unsafe page safe (the notification of this state is handled by other means).
16145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SSLUITestBlock, TestBlockRunningInsecureContent) {
16155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
16165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(https_server_.Start());
16175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string replacement_path;
16195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetFilePathWithHostAndPortReplacement(
16205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "files/ssl/page_runs_insecure_content.html",
16215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_server()->host_port_pair(),
16225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &replacement_path));
16235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(),
16255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               https_server_.GetURL(replacement_path));
16265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CheckAuthenticatedState(
16282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->tab_strip_model()->GetActiveWebContents(), false);
16295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Visit a page and establish a WebSocket connection over bad https with
16325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// --ignore-certificate-errors. The connection should be established without
16335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// interstitial page showing.
16345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SSLUITestIgnoreCertErrors, TestWSS) {
16355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
16365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(wss_server_expired_.Start());
16375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Setup page title observer.
16392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents();
16405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::TitleWatcher watcher(tab, ASCIIToUTF16("PASS"));
16415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  watcher.AlsoWaitForTitle(ASCIIToUTF16("FAIL"));
16425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Visit bad HTTPS page.
16445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string scheme("https");
16455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL::Replacements replacements;
16465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  replacements.SetSchemeStr(scheme);
16475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(
16485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      browser(),
16495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      wss_server_expired_.GetURL(
16505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          "connect_check.html").ReplaceComponents(replacements));
16515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We shouldn't have an interstitial page showing here.
16535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test page run a WebSocket wss connection test. The result will be shown
16555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // as page title.
16565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const string16 result = watcher.WaitAndGetTitle();
16575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(LowerCaseEqualsASCII(result, "pass"));
16585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(jcampan): more tests to do below.
16615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Visit a page over https that contains a frame with a redirect.
16635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// XMLHttpRequest insecure content in synchronous mode.
16655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// XMLHttpRequest insecure content in asynchronous mode.
16675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// XMLHttpRequest over bad ssl in synchronous mode.
16695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// XMLHttpRequest over OK ssl in synchronous mode.
1671