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)// This test creates a fake safebrowsing service, where we can inject
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// malware and phishing urls.  It then uses a real browser to go to
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// these urls, and sends "goback" or "proceed" commands and verifies
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// they work.
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
11a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "base/command_line.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h"
13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browser_process.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/safe_browsing/database_manager.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/safe_browsing/malware_details.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/safe_browsing/safe_browsing_blocking_page.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/safe_browsing/safe_browsing_service.h"
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/safe_browsing/safe_browsing_util.h"
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/safe_browsing/ui_manager.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_tabstrip.h"
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/tabs/tab_strip_model.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/url_constants.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/in_process_browser_test.h"
29a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/test/base/test_switches.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/ui_test_utils.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/interstitial_page.h"
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/navigation_controller.h"
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_types.h"
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_view_host.h"
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h"
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents_view.h"
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/test_browser_thread.h"
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/test/test_utils.h"
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::InterstitialPage;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::NavigationController;
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebContents;
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kEmptyPage[] = "files/empty.html";
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kMalwarePage[] = "files/safe_browsing/malware.html";
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kMalwareIframe[] = "files/safe_browsing/malware_iframe.html";
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class InterstitialObserver : public content::WebContentsObserver {
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  InterstitialObserver(content::WebContents* web_contents,
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       const base::Closure& attach_callback,
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       const base::Closure& detach_callback)
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : WebContentsObserver(web_contents),
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        attach_callback_(attach_callback),
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        detach_callback_(detach_callback) {
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void DidAttachInterstitialPage() OVERRIDE {
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    attach_callback_.Run();
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void DidDetachInterstitialPage() OVERRIDE {
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    detach_callback_.Run();
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::Closure attach_callback_;
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::Closure detach_callback_;
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(InterstitialObserver);
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// A SafeBrowsingDatabaseManager class that allows us to inject the malicious
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// URLs.
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class FakeSafeBrowsingDatabaseManager :  public SafeBrowsingDatabaseManager {
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  explicit FakeSafeBrowsingDatabaseManager(SafeBrowsingService* service)
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : SafeBrowsingDatabaseManager(service) { }
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Called on the IO thread to check if the given url is safe or not.  If we
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // can synchronously determine that the url is safe, CheckUrl returns true.
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Otherwise it returns false, and "client" is called asynchronously with the
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // result when it is ready.
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Overrides SafeBrowsingDatabaseManager::CheckBrowseUrl.
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual bool CheckBrowseUrl(const GURL& gurl, Client* client) OVERRIDE {
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (badurls[gurl.spec()] == SB_THREAT_TYPE_SAFE)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return true;
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BrowserThread::PostTask(
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        BrowserThread::IO, FROM_HERE,
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        base::Bind(&FakeSafeBrowsingDatabaseManager::OnCheckBrowseURLDone,
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   this, gurl, client));
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnCheckBrowseURLDone(const GURL& gurl, Client* client) {
10058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    std::vector<SBThreatType> expected_threats;
10158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    expected_threats.push_back(SB_THREAT_TYPE_URL_MALWARE);
10258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    expected_threats.push_back(SB_THREAT_TYPE_URL_PHISHING);
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SafeBrowsingDatabaseManager::SafeBrowsingCheck sb_check(
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        std::vector<GURL>(1, gurl),
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        std::vector<SBFullHash>(),
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        client,
10758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        safe_browsing_util::MALWARE,
10858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        expected_threats);
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    sb_check.url_results[0] = badurls[gurl.spec()];
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    client->OnSafeBrowsingResult(sb_check);
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetURLThreatType(const GURL& url, SBThreatType threat_type) {
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    badurls[url.spec()] = threat_type;
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~FakeSafeBrowsingDatabaseManager() {}
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::hash_map<std::string, SBThreatType> badurls;
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(FakeSafeBrowsingDatabaseManager);
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// A SafeBrowingUIManager class that allows intercepting malware details.
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class FakeSafeBrowsingUIManager :  public SafeBrowsingUIManager {
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  explicit FakeSafeBrowsingUIManager(SafeBrowsingService* service) :
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      SafeBrowsingUIManager(service) { }
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Overrides SafeBrowsingUIManager
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SendSerializedMalwareDetails(
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const std::string& serialized) OVERRIDE {
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reports_.push_back(serialized);
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Notify the UI thread that we got a report.
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BrowserThread::PostTask(
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        BrowserThread::UI, FROM_HERE,
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        base::Bind(&FakeSafeBrowsingUIManager::OnMalwareDetailsDone, this));
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnMalwareDetailsDone() {
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(BrowserThread::CurrentlyOn(BrowserThread::UI));
14290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoopForUI::current()->Quit();
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string GetReport() {
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(reports_.size() == 1);
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return reports_[0];
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected:
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~FakeSafeBrowsingUIManager() { }
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> reports_;
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(FakeSafeBrowsingUIManager);
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class FakeSafeBrowsingService : public SafeBrowsingService {
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
1613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  FakeSafeBrowsingService()
1623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      : fake_database_manager_(),
1633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        fake_ui_manager_() { }
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Returned pointer has the same lifespan as the database_manager_ refcounted
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // object.
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FakeSafeBrowsingDatabaseManager* fake_database_manager() {
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return fake_database_manager_;
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Returned pointer has the same lifespan as the ui_manager_ refcounted
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // object.
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FakeSafeBrowsingUIManager* fake_ui_manager() {
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return fake_ui_manager_;
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected:
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~FakeSafeBrowsingService() { }
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual SafeBrowsingDatabaseManager* CreateDatabaseManager() OVERRIDE {
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    fake_database_manager_ = new FakeSafeBrowsingDatabaseManager(this);
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return fake_database_manager_;
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual SafeBrowsingUIManager* CreateUIManager() OVERRIDE {
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    fake_ui_manager_ = new FakeSafeBrowsingUIManager(this);
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return fake_ui_manager_;
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FakeSafeBrowsingDatabaseManager* fake_database_manager_;
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FakeSafeBrowsingUIManager* fake_ui_manager_;
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(FakeSafeBrowsingService);
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Factory that creates FakeSafeBrowsingService instances.
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestSafeBrowsingServiceFactory : public SafeBrowsingServiceFactory {
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestSafeBrowsingServiceFactory() :
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      most_recent_service_(NULL) { }
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~TestSafeBrowsingServiceFactory() { }
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual SafeBrowsingService* CreateSafeBrowsingService() OVERRIDE {
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    most_recent_service_ =  new FakeSafeBrowsingService();
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return most_recent_service_;
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FakeSafeBrowsingService* most_recent_service() const {
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return most_recent_service_;
2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FakeSafeBrowsingService* most_recent_service_;
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A MalwareDetails class lets us intercept calls from the renderer.
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FakeMalwareDetails : public MalwareDetails {
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FakeMalwareDetails(
2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      SafeBrowsingUIManager* delegate,
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      WebContents* web_contents,
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const SafeBrowsingUIManager::UnsafeResource& unsafe_resource)
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : MalwareDetails(delegate, web_contents, unsafe_resource),
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        got_dom_(false),
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        waiting_(false) { }
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void AddDOMDetails(
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::vector<SafeBrowsingHostMsg_MalwareDOMDetails_Node>& params)
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          OVERRIDE {
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(BrowserThread::CurrentlyOn(BrowserThread::IO));
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MalwareDetails::AddDOMDetails(params);
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Notify the UI thread that we got the dom details.
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            base::Bind(&FakeMalwareDetails::OnDOMDetailsDone,
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       this));
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void WaitForDOM() {
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (got_dom_) {
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      LOG(INFO) << "Already got the dom details.";
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // This condition might not trigger normally, but if you add a
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // sleep(1) in malware_dom_details it triggers :).
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    waiting_ = true;
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LOG(INFO) << "Waiting for dom details.";
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::RunMessageLoop();
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(got_dom_);
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~FakeMalwareDetails() {}
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnDOMDetailsDone() {
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    got_dom_ = true;
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (waiting_) {
25890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      base::MessageLoopForUI::current()->Quit();
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Some logic to figure out if we should wait for the dom details or not.
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // These variables should only be accessed in the UI thread.
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool got_dom_;
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool waiting_;
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestMalwareDetailsFactory : public MalwareDetailsFactory {
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
2703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  TestMalwareDetailsFactory() : details_() { }
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~TestMalwareDetailsFactory() { }
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual MalwareDetails* CreateMalwareDetails(
2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      SafeBrowsingUIManager* delegate,
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WebContents* web_contents,
2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const SafeBrowsingUIManager::UnsafeResource& unsafe_resource) OVERRIDE {
2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    details_ = new FakeMalwareDetails(delegate, web_contents,
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      unsafe_resource);
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return details_;
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FakeMalwareDetails* get_details() {
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return details_;
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FakeMalwareDetails* details_;
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A SafeBrowingBlockingPage class that lets us wait until it's hidden.
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestSafeBrowsingBlockingPage : public SafeBrowsingBlockingPageV2 {
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestSafeBrowsingBlockingPage(SafeBrowsingUIManager* manager,
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               WebContents* web_contents,
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               const UnsafeResourceList& unsafe_resources)
2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : SafeBrowsingBlockingPageV2(manager, web_contents, unsafe_resources),
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        wait_for_delete_(false) {
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Don't wait the whole 3 seconds for the browser test.
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    malware_details_proceed_delay_ms_ = 100;
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~TestSafeBrowsingBlockingPage() {
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!wait_for_delete_)
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Notify that we are gone
30790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoopForUI::current()->Quit();
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    wait_for_delete_ = false;
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void WaitForDelete() {
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    wait_for_delete_ = true;
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::RunMessageLoop();
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool wait_for_delete_;
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestSafeBrowsingBlockingPageFactory
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : public SafeBrowsingBlockingPageFactory {
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestSafeBrowsingBlockingPageFactory() { }
3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~TestSafeBrowsingBlockingPageFactory() { }
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual SafeBrowsingBlockingPage* CreateSafeBrowsingPage(
3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      SafeBrowsingUIManager* delegate,
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WebContents* web_contents,
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const SafeBrowsingBlockingPage::UnsafeResourceList& unsafe_resources)
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          OVERRIDE {
3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return new TestSafeBrowsingBlockingPage(delegate, web_contents,
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            unsafe_resources);
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests the safe browsing blocking page in a browser.
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SafeBrowsingBlockingPageTest : public InProcessBrowserTest {
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum Visibility {
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    VISIBILITY_ERROR = -1,
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HIDDEN = 0,
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    VISIBLE = 1,
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SafeBrowsingBlockingPageTest() {
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() OVERRIDE {
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SafeBrowsingService::RegisterFactory(&factory_);
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SafeBrowsingBlockingPage::RegisterFactory(&blocking_page_factory_);
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MalwareDetails::RegisterFactory(&details_factory_);
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    InProcessBrowserTest::SetUp();
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TearDown() OVERRIDE {
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    InProcessBrowserTest::TearDown();
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SafeBrowsingBlockingPage::RegisterFactory(NULL);
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SafeBrowsingService::RegisterFactory(NULL);
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MalwareDetails::RegisterFactory(NULL);
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUpInProcessBrowserTestFixture() OVERRIDE {
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(test_server()->Start());
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetURLThreatType(const GURL& url, SBThreatType threat_type) {
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FakeSafeBrowsingService* service =
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        static_cast<FakeSafeBrowsingService*>(
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            g_browser_process->safe_browsing_service());
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(service);
3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    service->fake_database_manager()->SetURLThreatType(url, threat_type);
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Adds a safebrowsing result of type |threat_type| to the fake safebrowsing
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // service, navigates to that page, and returns the url.
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL SetupWarningAndNavigate(SBThreatType threat_type) {
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GURL url = test_server()->GetURL(kEmptyPage);
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetURLThreatType(url, threat_type);
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_test_utils::NavigateToURL(browser(), url);
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(WaitForReady());
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return url;
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Adds a safebrowsing malware result to the fake safebrowsing service,
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // navigates to a page with an iframe containing the malware site, and
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // returns the url of the parent page.
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL SetupMalwareIframeWarningAndNavigate() {
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GURL url = test_server()->GetURL(kMalwarePage);
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GURL iframe_url = test_server()->GetURL(kMalwareIframe);
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetURLThreatType(iframe_url, SB_THREAT_TYPE_URL_MALWARE);
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_test_utils::NavigateToURL(browser(), url);
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(WaitForReady());
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return url;
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SendCommand(const std::string& command) {
4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    WebContents* contents =
4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        browser()->tab_strip_model()->GetActiveWebContents();
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // We use InterstitialPage::GetInterstitialPage(tab) instead of
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // tab->GetInterstitialPage() because the tab doesn't have a pointer
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // to its interstital page until it gets a command from the renderer
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // that it has indeed displayed it -- and this sometimes happens after
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // NavigateToURL returns.
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SafeBrowsingBlockingPage* interstitial_page =
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        static_cast<SafeBrowsingBlockingPage*>(
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            InterstitialPage::GetInterstitialPage(contents)->
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                GetDelegateForTesting());
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(interstitial_page);
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    interstitial_page->CommandReceived(command);
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DontProceedThroughInterstitial() {
4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    WebContents* contents =
4192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        browser()->tab_strip_model()->GetActiveWebContents();
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    InterstitialPage* interstitial_page = InterstitialPage::GetInterstitialPage(
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        contents);
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(interstitial_page);
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    interstitial_page->DontProceed();
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ProceedThroughInterstitial() {
4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    WebContents* contents =
4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        browser()->tab_strip_model()->GetActiveWebContents();
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    InterstitialPage* interstitial_page = InterstitialPage::GetInterstitialPage(
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        contents);
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(interstitial_page);
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    interstitial_page->Proceed();
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AssertNoInterstitial(bool wait_for_delete) {
4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    WebContents* contents =
4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        browser()->tab_strip_model()->GetActiveWebContents();
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (contents->ShowingInterstitialPage() && wait_for_delete) {
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // We'll get notified when the interstitial is deleted.
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      TestSafeBrowsingBlockingPage* page =
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          static_cast<TestSafeBrowsingBlockingPage*>(
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              contents->GetInterstitialPage()->GetDelegateForTesting());
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      page->WaitForDelete();
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Can't use InterstitialPage::GetInterstitialPage() because that
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // gets updated after the TestSafeBrowsingBlockingPage destructor
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_FALSE(contents->ShowingInterstitialPage());
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool YesInterstitial() {
4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    WebContents* contents =
4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        browser()->tab_strip_model()->GetActiveWebContents();
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    InterstitialPage* interstitial_page = InterstitialPage::GetInterstitialPage(
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        contents);
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return interstitial_page != NULL;
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void WaitForInterstitial() {
4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    WebContents* contents =
4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        browser()->tab_strip_model()->GetActiveWebContents();
4632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_refptr<content::MessageLoopRunner> loop_runner(
4642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        new content::MessageLoopRunner);
4652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    InterstitialObserver observer(contents,
4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  loop_runner->QuitClosure(),
4672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  base::Closure());
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!InterstitialPage::GetInterstitialPage(contents))
4692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      loop_runner->Run();
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AssertReportSent() {
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // When a report is scheduled in the IO thread we should get notified.
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::RunMessageLoop();
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    std::string serialized = factory_.most_recent_service()->
4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        fake_ui_manager()->GetReport();
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    safe_browsing::ClientMalwareReportRequest report;
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(report.ParseFromString(serialized));
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Verify the report is complete.
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(report.complete());
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  void MalwareRedirectCancelAndProceed(const std::string& open_function) {
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GURL load_url = test_server()->GetURL(
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "files/safe_browsing/interstitial_cancel.html");
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GURL malware_url("http://localhost/files/safe_browsing/malware.html");
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetURLThreatType(malware_url, SB_THREAT_TYPE_URL_MALWARE);
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Load the test page.
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_test_utils::NavigateToURL(browser(), load_url);
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Trigger the safe browsing interstitial page via a redirect in
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // "openWin()".
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_test_utils::NavigateToURLWithDisposition(
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        browser(),
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        GURL("javascript:" + open_function + "()"),
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        CURRENT_TAB,
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ui_test_utils::BROWSER_TEST_WAIT_FOR_TAB);
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WaitForInterstitial();
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Cancel the redirect request while interstitial page is open.
5032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    browser()->tab_strip_model()->ActivateTabAt(0, true);
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_test_utils::NavigateToURLWithDisposition(
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        browser(),
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        GURL("javascript:stopWin()"),
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        CURRENT_TAB,
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    browser()->tab_strip_model()->ActivateTabAt(1, true);
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Simulate the user clicking "proceed", there should be no crash.  Since
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // clicking proceed may do nothing (see comment in MalwareRedirectCanceled
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // below, and crbug.com/76460), we use SendCommand to trigger the callback
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // directly rather than using ClickAndWaitForDetach since there might not
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // be a notification to wait for.
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SendCommand("\"proceed\"");
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::RenderViewHost* GetRenderViewHost() {
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    InterstitialPage* interstitial = InterstitialPage::GetInterstitialPage(
5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        browser()->tab_strip_model()->GetActiveWebContents());
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!interstitial)
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return NULL;
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return interstitial->GetRenderViewHostForTesting();
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool WaitForReady() {
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::RenderViewHost* rvh = GetRenderViewHost();
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!rvh)
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Wait until all <script> tags have executed, including jstemplate.
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // TODO(joaodasilva): it would be nice to avoid the busy loop, though in
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // practice it spins at most once or twice.
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string ready_state;
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    do {
5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      scoped_ptr<base::Value> value = content::ExecuteScriptAndGetValue(
5362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          rvh, "document.readyState");
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (!value.get() || !value->GetAsString(&ready_state))
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return false;
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } while (ready_state != "complete");
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Visibility GetVisibility(const std::string& node_id) {
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::RenderViewHost* rvh = GetRenderViewHost();
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!rvh)
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return VISIBILITY_ERROR;
5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<base::Value> value = content::ExecuteScriptAndGetValue(
5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        rvh,
5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "var node = document.getElementById('" + node_id + "');\n"
5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "if (node)\n"
5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "   node.offsetWidth > 0 && node.offsetHeight > 0;"
5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "else\n"
5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "  'node not found';\n");
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!value.get())
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return VISIBILITY_ERROR;
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool result = false;
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!value->GetAsBoolean(&result))
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return VISIBILITY_ERROR;
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return result ? VISIBLE : HIDDEN;
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool Click(const std::string& node_id) {
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::RenderViewHost* rvh = GetRenderViewHost();
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!rvh)
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // We don't use ExecuteScriptAndGetValue for this one, since clicking
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // the button/link may navigate away before the injected javascript can
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // reply, hanging the test.
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rvh->ExecuteJavascriptInWebFrame(
570a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        base::string16(),
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ASCIIToUTF16("document.getElementById('" + node_id + "').click();\n"));
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool ClickAndWaitForDetach(const std::string& node_id) {
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // We wait for interstitial_detached rather than nav_entry_committed, as
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // going back from a main-frame malware interstitial page will not cause a
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // nav entry committed event.
5792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_refptr<content::MessageLoopRunner> loop_runner(
5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        new content::MessageLoopRunner);
5812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    InterstitialObserver observer(
5822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        browser()->tab_strip_model()->GetActiveWebContents(),
5832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        base::Closure(),
5842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        loop_runner->QuitClosure());
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!Click(node_id))
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    loop_runner->Run();
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestMalwareDetailsFactory details_factory_;
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestSafeBrowsingServiceFactory factory_;
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestSafeBrowsingBlockingPageFactory blocking_page_factory_;
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(SafeBrowsingBlockingPageTest);
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// TODO(linux_aura) http://crbug.com/163931
6022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// TODO(win_aura) http://crbug.com/154081
6032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(USE_AURA) && !defined(OS_CHROMEOS)
6042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_MalwareRedirectInIFrameCanceled DISABLED_MalwareRedirectInIFrameCanceled
6052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
6062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_MalwareRedirectInIFrameCanceled MalwareRedirectInIFrameCanceled
6072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SafeBrowsingBlockingPageTest,
6092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       MAYBE_MalwareRedirectInIFrameCanceled) {
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 1. Test the case that redirect is a subresource.
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MalwareRedirectCancelAndProceed("openWinIFrame");
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If the redirect was from subresource but canceled, "proceed" will continue
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // with the rest of resources.
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AssertNoInterstitial(true);
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SafeBrowsingBlockingPageTest,
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       MalwareRedirectCanceled) {
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 2. Test the case that redirect is the only resource.
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MalwareRedirectCancelAndProceed("openWin");
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Clicking proceed won't do anything if the main request is cancelled
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // already.  See crbug.com/76460.
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(YesInterstitial());
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SafeBrowsingBlockingPageTest, MalwareDontProceed) {
627ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#if defined(OS_WIN) && defined(USE_ASH)
628ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // Disable this test in Metro+Ash for now (http://crbug.com/262796).
629a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kAshBrowserTests))
630ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    return;
631ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#endif
632ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetupWarningAndNavigate(SB_THREAT_TYPE_URL_MALWARE);
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(VISIBLE, GetVisibility("malware-icon"));
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(HIDDEN, GetVisibility("subresource-icon"));
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(HIDDEN, GetVisibility("phishing-icon"));
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(VISIBLE, GetVisibility("check-report"));
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(HIDDEN, GetVisibility("show-diagnostic-link"));
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(HIDDEN, GetVisibility("report-error-link"));
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(HIDDEN, GetVisibility("proceed"));
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(Click("see-more-link"));
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(VISIBLE, GetVisibility("show-diagnostic-link"));
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(HIDDEN, GetVisibility("report-error-link"));
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(VISIBLE, GetVisibility("proceed"));
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(ClickAndWaitForDetach("back"));
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AssertNoInterstitial(false);   // Assert the interstitial is gone
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(
65090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      GURL(content::kAboutBlankURL),  // Back to "about:blank"
6512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->tab_strip_model()->GetActiveWebContents()->GetURL());
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SafeBrowsingBlockingPageTest, MalwareProceed) {
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url = SetupWarningAndNavigate(SB_THREAT_TYPE_URL_MALWARE);
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(ClickAndWaitForDetach("proceed"));
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AssertNoInterstitial(true);  // Assert the interstitial is gone.
6592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(url,
6602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            browser()->tab_strip_model()->GetActiveWebContents()->GetURL());
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SafeBrowsingBlockingPageTest,
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       MalwareLearnMore) {
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetupWarningAndNavigate(SB_THREAT_TYPE_URL_MALWARE);
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(ClickAndWaitForDetach("learn-more-link"));
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AssertNoInterstitial(false);  // Assert the interstitial is gone
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We are in the help page.
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "/goodtoknow/online-safety/malware/",
6732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       browser()->tab_strip_model()->GetActiveWebContents()->GetURL().path());
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SafeBrowsingBlockingPageTest,
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       MalwareIframeDontProceed) {
678ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#if defined(OS_WIN) && defined(USE_ASH)
679ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // Disable this test in Metro+Ash for now (http://crbug.com/262796).
680a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kAshBrowserTests))
681ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    return;
682ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#endif
683ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetupMalwareIframeWarningAndNavigate();
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(HIDDEN, GetVisibility("malware-icon"));
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(VISIBLE, GetVisibility("subresource-icon"));
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(HIDDEN, GetVisibility("phishing-icon"));
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(VISIBLE, GetVisibility("check-report"));
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(HIDDEN, GetVisibility("show-diagnostic-link"));
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(HIDDEN, GetVisibility("report-error-link"));
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(HIDDEN, GetVisibility("proceed"));
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(Click("see-more-link"));
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(VISIBLE, GetVisibility("show-diagnostic-link"));
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(HIDDEN, GetVisibility("report-error-link"));
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(VISIBLE, GetVisibility("proceed"));
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(ClickAndWaitForDetach("back"));
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AssertNoInterstitial(false);  // Assert the interstitial is gone
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(
70290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      GURL(content::kAboutBlankURL),  // Back to "about:blank"
7032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->tab_strip_model()->GetActiveWebContents()->GetURL());
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(SafeBrowsingBlockingPageTest, MalwareIframeProceed) {
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url = SetupMalwareIframeWarningAndNavigate();
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(ClickAndWaitForDetach("proceed"));
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AssertNoInterstitial(true);  // Assert the interstitial is gone
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(url,
7132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            browser()->tab_strip_model()->GetActiveWebContents()->GetURL());
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
716d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// http://crbug.com/273302
717d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#if defined(OS_WIN)
718d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#define MAYBE_MalwareIframeReportDetails DISABLED_MalwareIframeReportDetails
719d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#else
720d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#define MAYBE_MalwareIframeReportDetails MalwareIframeReportDetails
721d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#endif
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SafeBrowsingBlockingPageTest,
723d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                       MAYBE_MalwareIframeReportDetails) {
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url = SetupMalwareIframeWarningAndNavigate();
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If the DOM details from renderer did not already return, wait for them.
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  details_factory_.get_details()->WaitForDOM();
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(Click("check-report"));
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(ClickAndWaitForDetach("proceed"));
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AssertNoInterstitial(true);  // Assert the interstitial is gone
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(browser()->profile()->GetPrefs()->GetBoolean(
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      prefs::kSafeBrowsingReportingEnabled));
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(url,
7382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            browser()->tab_strip_model()->GetActiveWebContents()->GetURL());
7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AssertReportSent();
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies that the "proceed anyway" link isn't available when it is disabled
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// by the corresponding policy. Also verifies that sending the "proceed"
7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// command anyway doesn't advance to the malware site.
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SafeBrowsingBlockingPageTest, ProceedDisabled) {
746ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#if defined(OS_WIN) && defined(USE_ASH)
747ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // Disable this test in Metro+Ash for now (http://crbug.com/262796).
748a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kAshBrowserTests))
749ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    return;
750ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#endif
751ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulate a policy disabling the "proceed anyway" link.
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  browser()->profile()->GetPrefs()->SetBoolean(
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      prefs::kSafeBrowsingProceedAnywayDisabled, true);
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetupWarningAndNavigate(SB_THREAT_TYPE_URL_MALWARE);
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(VISIBLE, GetVisibility("check-report"));
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(HIDDEN, GetVisibility("show-diagnostic-link"));
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(HIDDEN, GetVisibility("proceed"));
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(HIDDEN, GetVisibility("proceed-span"));
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(Click("see-more-link"));
7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(VISIBLE, GetVisibility("show-diagnostic-link"));
7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(HIDDEN, GetVisibility("proceed"));
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(HIDDEN, GetVisibility("proceed-span"));
7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The "proceed" command should go back instead, if proceeding is disabled.
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(ClickAndWaitForDetach("proceed"));
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AssertNoInterstitial(true);
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(
77190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      GURL(content::kAboutBlankURL),  // Back to "about:blank"
7722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->tab_strip_model()->GetActiveWebContents()->GetURL());
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies that the reporting checkbox is hidden on non-HTTP pages.
7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(mattm): Should also verify that no report is sent, but there isn't a
7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// good way to do that in the current design.
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SafeBrowsingBlockingPageTest, ReportingDisabled) {
779ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#if defined(OS_WIN) && defined(USE_ASH)
780ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // Disable this test in Metro+Ash for now (http://crbug.com/262796).
781a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kAshBrowserTests))
782ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    return;
783ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#endif
784ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  browser()->profile()->GetPrefs()->SetBoolean(
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      prefs::kSafeBrowsingReportingEnabled, true);
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
788c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  net::SpawnedTestServer https_server(
789c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      net::SpawnedTestServer::TYPE_HTTPS, net::SpawnedTestServer::kLocalhost,
7902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("chrome/test/data")));
7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(https_server.Start());
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url = https_server.GetURL(kEmptyPage);
7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetURLThreatType(url, SB_THREAT_TYPE_URL_MALWARE);
7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), url);
7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(WaitForReady());
7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(HIDDEN, GetVisibility("check-report"));
7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(HIDDEN, GetVisibility("show-diagnostic-link"));
7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(HIDDEN, GetVisibility("proceed"));
8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(Click("see-more-link"));
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(VISIBLE, GetVisibility("show-diagnostic-link"));
8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(VISIBLE, GetVisibility("proceed"));
8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(ClickAndWaitForDetach("back"));
8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AssertNoInterstitial(false);   // Assert the interstitial is gone
8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(
80790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      GURL(content::kAboutBlankURL),  // Back to "about:blank"
8082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->tab_strip_model()->GetActiveWebContents()->GetURL());
8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SafeBrowsingBlockingPageTest, PhishingDontProceed) {
812ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#if defined(OS_WIN) && defined(USE_ASH)
813ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // Disable this test in Metro+Ash for now (http://crbug.com/262796).
814a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kAshBrowserTests))
815ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    return;
816ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#endif
817ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetupWarningAndNavigate(SB_THREAT_TYPE_URL_PHISHING);
8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(HIDDEN, GetVisibility("malware-icon"));
8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(HIDDEN, GetVisibility("subresource-icon"));
8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(VISIBLE, GetVisibility("phishing-icon"));
8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(HIDDEN, GetVisibility("check-report"));
8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(HIDDEN, GetVisibility("show-diagnostic-link"));
8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(HIDDEN, GetVisibility("report-error-link"));
8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(HIDDEN, GetVisibility("proceed"));
8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(Click("see-more-link"));
8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(HIDDEN, GetVisibility("show-diagnostic-link"));
8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(VISIBLE, GetVisibility("report-error-link"));
8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(VISIBLE, GetVisibility("proceed"));
8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(ClickAndWaitForDetach("back"));
8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AssertNoInterstitial(false);  // Assert the interstitial is gone
8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(
83590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      GURL(content::kAboutBlankURL),  // We are back to "about:blank".
8362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->tab_strip_model()->GetActiveWebContents()->GetURL());
8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
839868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// http://crbug.com/247763
840868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#if defined(OS_WIN)
841868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#define MAYBE_PhishingProceed DISABLED_PhishingProceed
842868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#else
843868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#define MAYBE_PhishingProceed PhishingProceed
844868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#endif
845868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
846868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SafeBrowsingBlockingPageTest, MAYBE_PhishingProceed) {
8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url = SetupWarningAndNavigate(SB_THREAT_TYPE_URL_PHISHING);
8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(ClickAndWaitForDetach("proceed"));
8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AssertNoInterstitial(true);  // Assert the interstitial is gone
8512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(url,
8522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            browser()->tab_strip_model()->GetActiveWebContents()->GetURL());
8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SafeBrowsingBlockingPageTest, PhishingReportError) {
8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetupWarningAndNavigate(SB_THREAT_TYPE_URL_PHISHING);
8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(ClickAndWaitForDetach("report-error-link"));
8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AssertNoInterstitial(false);  // Assert the interstitial is gone
8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We are in the error reporting page.
8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(
8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "/safebrowsing/report_error/",
8642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->tab_strip_model()->GetActiveWebContents()->GetURL().path());
8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
867868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// See crbug.com/248447
868868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#if defined(OS_WIN)
869868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#define MAYBE_PhishingLearnMore DISABLED_PhishingLearnMore
870868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#else
871868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#define MAYBE_PhishingLearnMore PhishingLearnMore
872868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#endif
873868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
874868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SafeBrowsingBlockingPageTest, MAYBE_PhishingLearnMore) {
8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetupWarningAndNavigate(SB_THREAT_TYPE_URL_PHISHING);
8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(ClickAndWaitForDetach("learn-more-link"));
8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AssertNoInterstitial(false);  // Assert the interstitial is gone
8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We are in the help page.
8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(
8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "/goodtoknow/online-safety/phishing/",
8832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       browser()->tab_strip_model()->GetActiveWebContents()->GetURL().path());
8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
885