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