Upstream version 9.38.198.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / ssl / ssl_blocking_page.h
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 #ifndef CHROME_BROWSER_SSL_SSL_BLOCKING_PAGE_H_
6 #define CHROME_BROWSER_SSL_SSL_BLOCKING_PAGE_H_
7
8 #include <string>
9 #include <vector>
10
11 #include "base/callback.h"
12 #include "base/strings/string16.h"
13 #include "base/task/cancelable_task_tracker.h"
14 #include "base/time/time.h"
15 #include "chrome/browser/history/history_service.h"
16 #include "content/public/browser/interstitial_page_delegate.h"
17 #include "net/ssl/ssl_info.h"
18 #include "url/gurl.h"
19
20 namespace base {
21 class DictionaryValue;
22 }
23
24 namespace content {
25 class InterstitialPage;
26 class WebContents;
27 }
28
29 #if defined(ENABLE_EXTENSIONS)
30 namespace extensions {
31 class ExperienceSamplingEvent;
32 }
33 #endif
34
35 // This class is responsible for showing/hiding the interstitial page that is
36 // shown when a certificate error happens.
37 // It deletes itself when the interstitial page is closed.
38 //
39 // This class should only be used on the UI thread because its implementation
40 // uses captive_portal::CaptivePortalService which can only be accessed on the
41 // UI thread.
42 class SSLBlockingPage : public content::InterstitialPageDelegate,
43                         public content::NotificationObserver {
44  public:
45   // These represent the commands sent from the interstitial JavaScript. They
46   // are defined in chrome/browser/resources/ssl/ssl_errors_common.js.
47   // DO NOT reorder or change these without also changing the JavaScript!
48   enum SSLBlockingPageCommands {
49     CMD_DONT_PROCEED = 0,
50     CMD_PROCEED = 1,
51     CMD_MORE = 2,
52     CMD_RELOAD = 3,
53     CMD_HELP = 4,
54     CMD_CLOCK = 5
55   };
56
57   enum SSLBlockingPageOptionsMask {
58     OVERRIDABLE = 1 << 0,
59     STRICT_ENFORCEMENT = 1 << 1,
60     EXPIRED_BUT_PREVIOUSLY_ALLOWED = 1 << 2
61   };
62
63   virtual ~SSLBlockingPage();
64
65   // Create an interstitial and show it.
66   void Show();
67
68   // Creates an SSL blocking page. If the blocking page isn't shown, the caller
69   // is responsible for cleaning up the blocking page, otherwise the
70   // interstitial takes ownership when shown. |options_mask| must be a bitwise
71   // mask of SSLBlockingPageOptionsMask values.
72   SSLBlockingPage(content::WebContents* web_contents,
73                   int cert_error,
74                   const net::SSLInfo& ssl_info,
75                   const GURL& request_url,
76                   int options_mask,
77                   const base::Callback<void(bool)>& callback);
78
79   // A method that sets strings in the specified dictionary from the passed
80   // vector so that they can be used to resource the ssl_roadblock.html/
81   // ssl_error.html files.
82   // Note: there can be up to 5 strings in |extra_info|.
83   static void SetExtraInfo(base::DictionaryValue* strings,
84                            const std::vector<base::string16>& extra_info);
85
86  protected:
87   // InterstitialPageDelegate implementation.
88   virtual std::string GetHTMLContents() OVERRIDE;
89   virtual void CommandReceived(const std::string& command) OVERRIDE;
90   virtual void OverrideEntry(content::NavigationEntry* entry) OVERRIDE;
91   virtual void OverrideRendererPrefs(
92       content::RendererPreferences* prefs) OVERRIDE;
93   virtual void OnProceed() OVERRIDE;
94   virtual void OnDontProceed() OVERRIDE;
95
96  private:
97   void NotifyDenyCertificate();
98   void NotifyAllowCertificate();
99
100   // Used to query the HistoryService to see if the URL is in history. For UMA.
101   void OnGotHistoryCount(bool success, int num_visits, base::Time first_visit);
102
103   // content::NotificationObserver:
104   virtual void Observe(
105       int type,
106       const content::NotificationSource& source,
107       const content::NotificationDetails& details) OVERRIDE;
108
109   base::Callback<void(bool)> callback_;
110
111   content::WebContents* web_contents_;
112   const int cert_error_;
113   const net::SSLInfo ssl_info_;
114   const GURL request_url_;
115   // Could the user successfully override the error?
116   // overridable_ will be set to false if strict_enforcement_ is true.
117   const bool overridable_;
118   // Has the site requested strict enforcement of certificate errors?
119   const bool strict_enforcement_;
120   content::InterstitialPage* interstitial_page_;  // Owns us.
121   // Is the hostname for an internal network?
122   bool internal_;
123   // How many times is this same URL in history?
124   int num_visits_;
125   // Used for getting num_visits_.
126   base::CancelableTaskTracker request_tracker_;
127   // Is captive portal detection enabled?
128   bool captive_portal_detection_enabled_;
129   // Did the probe complete before the interstitial was closed?
130   bool captive_portal_probe_completed_;
131   // Did the captive portal probe receive an error or get a non-HTTP response?
132   bool captive_portal_no_response_;
133   // Was a captive portal detected?
134   bool captive_portal_detected_;
135   // Did the user previously allow a bad certificate but the decision has now
136   // expired?
137   const bool expired_but_previously_allowed_;
138
139   // For the FieldTrial: this contains the name of the condition.
140   std::string trial_condition_;
141
142 #if defined(ENABLE_EXTENSIONS)
143   // For Chrome Experience Sampling Platform: this maintains event state.
144   scoped_ptr<extensions::ExperienceSamplingEvent> sampling_event_;
145 #endif
146
147   content::NotificationRegistrar registrar_;
148
149   DISALLOW_COPY_AND_ASSIGN(SSLBlockingPage);
150 };
151
152 #endif  // CHROME_BROWSER_SSL_SSL_BLOCKING_PAGE_H_