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