Update mojo surfaces bindings and mojo/cc/ glue
[chromium-blink-merge.git] / chrome / browser / safe_browsing / safe_browsing_blocking_page.h
blob640677a4daa359efa61996d7bb448f1dd60a755b
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 //
5 // Classes for managing the SafeBrowsing interstitial pages.
6 //
7 // When a user is about to visit a page the SafeBrowsing system has deemed to
8 // be malicious, either as malware or a phishing page, we show an interstitial
9 // page with some options (go back, continue) to give the user a chance to avoid
10 // the harmful page.
12 // The SafeBrowsingBlockingPage is created by the SafeBrowsingUIManager on the
13 // UI thread when we've determined that a page is malicious. The operation of
14 // the blocking page occurs on the UI thread, where it waits for the user to
15 // make a decision about what to do: either go back or continue on.
17 // The blocking page forwards the result of the user's choice back to the
18 // SafeBrowsingUIManager so that we can cancel the request for the new page,
19 // or allow it to continue.
21 // A web page may contain several resources flagged as malware/phishing. This
22 // results into more than one interstitial being shown. On the first unsafe
23 // resource received we show an interstitial. Any subsequent unsafe resource
24 // notifications while the first interstitial is showing is queued. If the user
25 // decides to proceed in the first interstitial, we display all queued unsafe
26 // resources in a new interstitial.
28 #ifndef CHROME_BROWSER_SAFE_BROWSING_SAFE_BROWSING_BLOCKING_PAGE_H_
29 #define CHROME_BROWSER_SAFE_BROWSING_SAFE_BROWSING_BLOCKING_PAGE_H_
31 #include <map>
32 #include <string>
33 #include <vector>
35 #include "base/gtest_prod_util.h"
36 #include "base/task/cancelable_task_tracker.h"
37 #include "base/time/time.h"
38 #include "chrome/browser/history/history_service.h"
39 #include "chrome/browser/safe_browsing/ui_manager.h"
40 #include "content/public/browser/interstitial_page_delegate.h"
41 #include "url/gurl.h"
43 class MalwareDetails;
44 class SafeBrowsingBlockingPageFactory;
46 namespace base {
47 class DictionaryValue;
48 class MessageLoop;
51 namespace content {
52 class InterstitialPage;
53 class WebContents;
56 #if defined(ENABLE_EXTENSIONS)
57 namespace extensions {
58 class ExperienceSamplingEvent;
60 #endif
62 class SafeBrowsingBlockingPage : public content::InterstitialPageDelegate {
63 public:
64 typedef SafeBrowsingUIManager::UnsafeResource UnsafeResource;
65 typedef std::vector<UnsafeResource> UnsafeResourceList;
66 typedef std::map<content::WebContents*, UnsafeResourceList> UnsafeResourceMap;
68 virtual ~SafeBrowsingBlockingPage();
70 // Creates a blocking page. Use ShowBlockingPage if you don't need to access
71 // the blocking page directly.
72 static SafeBrowsingBlockingPage* CreateBlockingPage(
73 SafeBrowsingUIManager* ui_manager,
74 content::WebContents* web_contents,
75 const UnsafeResource& unsafe_resource);
77 // Shows a blocking page warning the user about phishing/malware for a
78 // specific resource.
79 // You can call this method several times, if an interstitial is already
80 // showing, the new one will be queued and displayed if the user decides
81 // to proceed on the currently showing interstitial.
82 static void ShowBlockingPage(
83 SafeBrowsingUIManager* ui_manager, const UnsafeResource& resource);
85 // Makes the passed |factory| the factory used to instantiate
86 // SafeBrowsingBlockingPage objects. Useful for tests.
87 static void RegisterFactory(SafeBrowsingBlockingPageFactory* factory) {
88 factory_ = factory;
91 // InterstitialPageDelegate method:
92 virtual std::string GetHTMLContents() OVERRIDE;
93 virtual void OnProceed() OVERRIDE;
94 virtual void OnDontProceed() OVERRIDE;
95 virtual void CommandReceived(const std::string& command) OVERRIDE;
96 virtual void OverrideRendererPrefs(
97 content::RendererPreferences* prefs) OVERRIDE;
99 protected:
100 friend class SafeBrowsingBlockingPageTest;
101 FRIEND_TEST_ALL_PREFIXES(SafeBrowsingBlockingPageTest,
102 ProceedThenDontProceed);
104 void DontCreateViewForTesting();
105 void Show();
106 void SetReportingPreference(bool report);
107 void UpdateReportingPref(); // Used for the transition from old to new pref.
109 // Don't instantiate this class directly, use ShowBlockingPage instead.
110 SafeBrowsingBlockingPage(SafeBrowsingUIManager* ui_manager,
111 content::WebContents* web_contents,
112 const UnsafeResourceList& unsafe_resources);
114 // After a malware interstitial where the user opted-in to the
115 // report but clicked "proceed anyway", we delay the call to
116 // MalwareDetails::FinishCollection() by this much time (in
117 // milliseconds), in order to get data from the blocked resource itself.
118 int64 malware_details_proceed_delay_ms_;
119 content::InterstitialPage* interstitial_page() const {
120 return interstitial_page_;
123 FRIEND_TEST_ALL_PREFIXES(SafeBrowsingBlockingPageTest,
124 MalwareReportsTransitionDisabled);
125 FRIEND_TEST_ALL_PREFIXES(SafeBrowsingBlockingPageTest,
126 MalwareReportsToggling);
128 enum BlockingPageEvent {
129 SHOW,
130 PROCEED,
131 DONT_PROCEED,
132 SHOW_ADVANCED,
135 // Records a user action for this interstitial, using the form
136 // SBInterstitial[Phishing|Malware|Multiple][Show|Proceed|DontProceed].
137 void RecordUserAction(BlockingPageEvent event);
139 // Used to query the HistoryService to see if the URL is in history. For UMA.
140 void OnGotHistoryCount(bool success, int num_visits, base::Time first_visit);
142 // Records the time it took for the user to react to the
143 // interstitial. We won't double-count if this method is called
144 // multiple times.
145 void RecordUserReactionTime(const std::string& command);
147 // Checks if we should even show the malware details option. For example, we
148 // don't show it in incognito mode.
149 bool CanShowMalwareDetailsOption();
151 // Called when the insterstitial is going away. If there is a
152 // pending malware details object, we look at the user's
153 // preferences, and if the option to send malware details is
154 // enabled, the report is scheduled to be sent on the |ui_manager_|.
155 void FinishMalwareDetails(int64 delay_ms);
157 // Returns the boolean value of the given |pref| from the PrefService of the
158 // Profile associated with |web_contents_|.
159 bool IsPrefEnabled(const char* pref);
161 // A list of SafeBrowsingUIManager::UnsafeResource for a tab that the user
162 // should be warned about. They are queued when displaying more than one
163 // interstitial at a time.
164 static UnsafeResourceMap* GetUnsafeResourcesMap();
166 // Notifies the SafeBrowsingUIManager on the IO thread whether to proceed
167 // or not for the |resources|.
168 static void NotifySafeBrowsingUIManager(
169 SafeBrowsingUIManager* ui_manager,
170 const UnsafeResourceList& resources, bool proceed);
172 // Returns true if the passed |unsafe_resources| is blocking the load of
173 // the main page.
174 static bool IsMainPageLoadBlocked(
175 const UnsafeResourceList& unsafe_resources);
177 friend class SafeBrowsingBlockingPageFactoryImpl;
179 // For reporting back user actions.
180 SafeBrowsingUIManager* ui_manager_;
181 base::MessageLoop* report_loop_;
183 // True if the interstitial is blocking the main page because it is on one
184 // of our lists. False if a subresource is being blocked, or in the case of
185 // client-side detection where the interstitial is shown after page load
186 // finishes.
187 bool is_main_frame_load_blocked_;
189 // The index of a navigation entry that should be removed when DontProceed()
190 // is invoked, -1 if not entry should be removed.
191 int navigation_entry_index_to_remove_;
193 // The list of unsafe resources this page is warning about.
194 UnsafeResourceList unsafe_resources_;
196 // A MalwareDetails object that we start generating when the
197 // blocking page is shown. The object will be sent when the warning
198 // is gone (if the user enables the feature).
199 scoped_refptr<MalwareDetails> malware_details_;
201 bool proceeded_;
203 content::WebContents* web_contents_;
204 GURL url_;
205 content::InterstitialPage* interstitial_page_; // Owns us
207 // Time when the interstitial was show. This variable is set in
208 // GetHTMLContents() which is called right before the interstitial
209 // is shown to the user. Will return is_null() once we reported the
210 // user action.
211 base::TimeTicks interstitial_show_time_;
213 // Whether the user has expanded the "see more" section of the page already
214 // during this interstitial page.
215 bool has_expanded_see_more_section_;
217 // Whether the user has left the reporting checkbox checked.
218 bool reporting_checkbox_checked_;
220 // Whether the interstitial should create a view.
221 bool create_view_;
223 // Which type of interstitial this is.
224 enum {
225 TYPE_MALWARE,
226 TYPE_PHISHING,
227 TYPE_MALWARE_AND_PHISHING,
228 } interstitial_type_;
230 // The factory used to instantiate SafeBrowsingBlockingPage objects.
231 // Usefull for tests, so they can provide their own implementation of
232 // SafeBrowsingBlockingPage.
233 static SafeBrowsingBlockingPageFactory* factory_;
235 // How many times is this same URL in history? Used for histogramming.
236 int num_visits_;
237 base::CancelableTaskTracker request_tracker_;
239 private:
240 // Fills the passed dictionary with the values to be passed to the template
241 // when creating the HTML.
242 void PopulateMalwareLoadTimeData(base::DictionaryValue* load_time_data);
243 void PopulatePhishingLoadTimeData(base::DictionaryValue* load_time_data);
245 #if defined(ENABLE_EXTENSIONS)
246 scoped_ptr<extensions::ExperienceSamplingEvent> sampling_event_;
247 #endif
249 DISALLOW_COPY_AND_ASSIGN(SafeBrowsingBlockingPage);
252 // Factory for creating SafeBrowsingBlockingPage. Useful for tests.
253 class SafeBrowsingBlockingPageFactory {
254 public:
255 virtual ~SafeBrowsingBlockingPageFactory() { }
257 virtual SafeBrowsingBlockingPage* CreateSafeBrowsingPage(
258 SafeBrowsingUIManager* ui_manager,
259 content::WebContents* web_contents,
260 const SafeBrowsingBlockingPage::UnsafeResourceList& unsafe_resources) = 0;
263 #endif // CHROME_BROWSER_SAFE_BROWSING_SAFE_BROWSING_BLOCKING_PAGE_H_