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)// Classes for managing the SafeBrowsing interstitial pages. 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// When a user is about to visit a page the SafeBrowsing system has deemed to 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// be malicious, either as malware or a phishing page, we show an interstitial 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// page with some options (go back, continue) to give the user a chance to avoid 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the harmful page. 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// The SafeBrowsingBlockingPage is created by the SafeBrowsingUIManager on the 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// UI thread when we've determined that a page is malicious. The operation of 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// the blocking page occurs on the UI thread, where it waits for the user to 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// make a decision about what to do: either go back or continue on. 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The blocking page forwards the result of the user's choice back to the 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// SafeBrowsingUIManager so that we can cancel the request for the new page, 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// or allow it to continue. 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A web page may contain several resources flagged as malware/phishing. This 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// results into more than one interstitial being shown. On the first unsafe 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// resource received we show an interstitial. Any subsequent unsafe resource 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// notifications while the first interstitial is showing is queued. If the user 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// decides to proceed in the first interstitial, we display all queued unsafe 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// resources in a new interstitial. 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CHROME_BROWSER_SAFE_BROWSING_SAFE_BROWSING_BLOCKING_PAGE_H_ 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_SAFE_BROWSING_SAFE_BROWSING_BLOCKING_PAGE_H_ 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <map> 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector> 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/gtest_prod_util.h" 36eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h" 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/safe_browsing/ui_manager.h" 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/interstitial_page_delegate.h" 39eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "url/gurl.h" 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MalwareDetails; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SafeBrowsingBlockingPageFactory; 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base { 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DictionaryValue; 46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class MessageLoop; 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content { 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class InterstitialPage; 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WebContents; 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SafeBrowsingBlockingPage : public content::InterstitialPageDelegate { 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) typedef SafeBrowsingUIManager::UnsafeResource UnsafeResource; 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) typedef std::vector<UnsafeResource> UnsafeResourceList; 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef std::map<content::WebContents*, UnsafeResourceList> UnsafeResourceMap; 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~SafeBrowsingBlockingPage(); 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Shows a blocking page warning the user about phishing/malware for a 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // specific resource. 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // You can call this method several times, if an interstitial is already 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // showing, the new one will be queued and displayed if the user decides 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to proceed on the currently showing interstitial. 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void ShowBlockingPage( 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SafeBrowsingUIManager* ui_manager, const UnsafeResource& resource); 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Makes the passed |factory| the factory used to instanciate 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // SafeBrowsingBlockingPage objects. Useful for tests. 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void RegisterFactory(SafeBrowsingBlockingPageFactory* factory) { 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) factory_ = factory; 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // InterstitialPageDelegate method: 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void CommandReceived(const std::string& command) OVERRIDE; 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OverrideRendererPrefs( 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RendererPreferences* prefs) OVERRIDE; 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnProceed() OVERRIDE; 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnDontProceed() OVERRIDE; 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class SafeBrowsingBlockingPageTest; 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(SafeBrowsingBlockingPageTest, 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProceedThenDontProceed); 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class SafeBrowsingBlockingPageV2Test; 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(SafeBrowsingBlockingPageV2Test, 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProceedThenDontProceed); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetReportingPreference(bool report); 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Don't instanciate this class directly, use ShowBlockingPage instead. 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SafeBrowsingBlockingPage(SafeBrowsingUIManager* ui_manager, 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::WebContents* web_contents, 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const UnsafeResourceList& unsafe_resources); 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // After a malware interstitial where the user opted-in to the 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // report but clicked "proceed anyway", we delay the call to 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // MalwareDetails::FinishCollection() by this much time (in 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // milliseconds), in order to get data from the blocked resource itself. 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 malware_details_proceed_delay_ms_; 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::InterstitialPage* interstitial_page() const { 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return interstitial_page_; 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(SafeBrowsingBlockingPageTest, MalwareReports); 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(SafeBrowsingBlockingPageV2Test, MalwareReports); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum BlockingPageEvent { 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SHOW, 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PROCEED, 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DONT_PROCEED, 114b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) SHOW_ADVANCED, 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Records a user action for this interstitial, using the form 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // SBInterstitial[Phishing|Malware|Multiple][Show|Proceed|DontProceed]. 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void RecordUserAction(BlockingPageEvent event); 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Records the time it took for the user to react to the 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // interstitial. We won't double-count if this method is called 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // multiple times. 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void RecordUserReactionTime(const std::string& command); 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Checks if we should even show the malware details option. For example, we 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // don't show it in incognito mode. 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool CanShowMalwareDetailsOption(); 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called when the insterstitial is going away. If there is a 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // pending malware details object, we look at the user's 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // preferences, and if the option to send malware details is 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // enabled, the report is scheduled to be sent on the |ui_manager_|. 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void FinishMalwareDetails(int64 delay_ms); 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the boolean value of the given |pref| from the PrefService of the 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Profile associated with |web_contents_|. 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool IsPrefEnabled(const char* pref); 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // A list of SafeBrowsingUIManager::UnsafeResource for a tab that the user 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // should be warned about. They are queued when displaying more than one 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // interstitial at a time. 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static UnsafeResourceMap* GetUnsafeResourcesMap(); 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Notifies the SafeBrowsingUIManager on the IO thread whether to proceed 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // or not for the |resources|. 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static void NotifySafeBrowsingUIManager( 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SafeBrowsingUIManager* ui_manager, 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const UnsafeResourceList& resources, bool proceed); 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns true if the passed |unsafe_resources| is blocking the load of 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the main page. 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool IsMainPageLoadBlocked( 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const UnsafeResourceList& unsafe_resources); 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class SafeBrowsingBlockingPageFactoryImpl; 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For reporting back user actions. 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SafeBrowsingUIManager* ui_manager_; 160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::MessageLoop* report_loop_; 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // True if the interstitial is blocking the main page because it is on one 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // of our lists. False if a subresource is being blocked, or in the case of 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // client-side detection where the interstitial is shown after page load 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // finishes. 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_main_frame_load_blocked_; 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The index of a navigation entry that should be removed when DontProceed() 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is invoked, -1 if not entry should be removed. 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int navigation_entry_index_to_remove_; 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The list of unsafe resources this page is warning about. 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UnsafeResourceList unsafe_resources_; 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A MalwareDetails object that we start generating when the 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // blocking page is shown. The object will be sent when the warning 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is gone (if the user enables the feature). 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<MalwareDetails> malware_details_; 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool proceeded_; 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::WebContents* web_contents_; 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url_; 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::InterstitialPage* interstitial_page_; // Owns us 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Time when the interstitial was show. This variable is set in 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // GetHTMLContents() which is called right before the interstitial 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is shown to the user. Will return is_null() once we reported the 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // user action. 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeTicks interstitial_show_time_; 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Whether the user has expanded the "see more" section of the page already 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // during this interstitial page. 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool has_expanded_see_more_section_; 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Which type of interstitial this is. 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum { 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TYPE_MALWARE, 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TYPE_PHISHING, 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TYPE_MALWARE_AND_PHISHING, 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } interstitial_type_; 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The factory used to instanciate SafeBrowsingBlockingPage objects. 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Usefull for tests, so they can provide their own implementation of 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // SafeBrowsingBlockingPage. 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static SafeBrowsingBlockingPageFactory* factory_; 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(SafeBrowsingBlockingPage); 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SafeBrowsingBlockingPageV1 : public SafeBrowsingBlockingPage { 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Don't instanciate this class directly, use ShowBlockingPage instead. 2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SafeBrowsingBlockingPageV1(SafeBrowsingUIManager* ui_manager, 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::WebContents* web_contents, 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const UnsafeResourceList& unsafe_resources); 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // InterstitialPageDelegate method: 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual std::string GetHTMLContents() OVERRIDE; 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Fills the passed dictionary with the strings passed to JS Template when 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // creating the HTML. 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void PopulateMultipleThreatStringDictionary(base::DictionaryValue* strings); 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void PopulateMalwareStringDictionary(base::DictionaryValue* strings); 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void PopulatePhishingStringDictionary(base::DictionaryValue* strings); 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A helper method used by the Populate methods above used to populate common 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // fields. 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void PopulateStringDictionary(base::DictionaryValue* strings, 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& title, 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& headline, 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& description1, 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& description2, 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& description3); 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(SafeBrowsingBlockingPageV1); 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SafeBrowsingBlockingPageV2 : public SafeBrowsingBlockingPage { 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Don't instanciate this class directly, use ShowBlockingPage instead. 2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SafeBrowsingBlockingPageV2(SafeBrowsingUIManager* ui_manager, 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::WebContents* web_contents, 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const UnsafeResourceList& unsafe_resources); 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // InterstitialPageDelegate method: 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual std::string GetHTMLContents() OVERRIDE; 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Fills the passed dictionary with the strings passed to JS Template when 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // creating the HTML. 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void PopulateMultipleThreatStringDictionary(base::DictionaryValue* strings); 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void PopulateMalwareStringDictionary(base::DictionaryValue* strings); 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void PopulatePhishingStringDictionary(base::DictionaryValue* strings); 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A helper method used by the Populate methods above used to populate common 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // fields. 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void PopulateStringDictionary(base::DictionaryValue* strings, 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& title, 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& headline, 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& description1, 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& description2, 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& description3); 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 266b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // For the FieldTrial: this contains the name of the condition. 267b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) std::string trialCondition_; 268b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(SafeBrowsingBlockingPageV2); 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Factory for creating SafeBrowsingBlockingPage. Useful for tests. 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SafeBrowsingBlockingPageFactory { 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~SafeBrowsingBlockingPageFactory() { } 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual SafeBrowsingBlockingPage* CreateSafeBrowsingPage( 2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SafeBrowsingUIManager* ui_manager, 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::WebContents* web_contents, 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const SafeBrowsingBlockingPage::UnsafeResourceList& unsafe_resources) = 0; 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // CHROME_BROWSER_SAFE_BROWSING_SAFE_BROWSING_BLOCKING_PAGE_H_ 284