Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(192)

Side by Side Diff: chrome/browser/ssl/ssl_error_handler.cc

Issue 318213002: Add custom interstitial for captive portals. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix build Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright (c) 2014 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 #include "chrome/browser/ssl/ssl_error_handler.h"
6
7 #include "base/time/time.h"
8 #include "base/timer/timer.h"
9 #include "chrome/browser/profiles/profile.h"
10 #include "chrome/browser/ssl/captive_portal_blocking_page.h"
11 #include "chrome/browser/ssl/ssl_blocking_page.h"
12 #include "content/public/browser/notification_service.h"
13 #include "content/public/browser/notification_source.h"
14 #include "content/public/browser/web_contents.h"
15
16 #if defined(ENABLE_CAPTIVE_PORTAL_DETECTION)
17 #include "chrome/browser/captive_portal/captive_portal_service.h"
18 #include "chrome/browser/captive_portal/captive_portal_service_factory.h"
19 #endif
20
21 // The delay before displaying the SSL interstitial, during which we wait for a
22 // captive portal result.
23 const int kDefaultSSLInterstitialDisplayDelay = 2;
24
25 SSLErrorHandler::SSLErrorHandler(content::WebContents* web_contents,
26 int cert_error,
27 const net::SSLInfo& ssl_info,
28 const GURL& request_url,
29 bool overridable,
30 bool strict_enforcement,
31 const base::Callback<void(bool)>& callback)
32 : content::WebContentsObserver(web_contents),
33 web_contents_(web_contents),
34 cert_error_(cert_error),
35 ssl_info_(ssl_info),
36 request_url_(request_url),
37 overridable_(overridable),
38 strict_enforcement_(strict_enforcement),
39 callback_(callback),
40 captive_portal_detection_enabled_(false),
41 handled_(false),
42 ssl_interstitial_display_delay_(
43 base::TimeDelta::FromSeconds(kDefaultSSLInterstitialDisplayDelay)) {
44 }
45
46 SSLErrorHandler::~SSLErrorHandler() {
47 }
48
49 void SSLErrorHandler::Handle() {
50 #if defined(ENABLE_CAPTIVE_PORTAL_DETECTION)
51 CheckForCaptivePortal();
52 timer_.Start(FROM_HERE, ssl_interstitial_display_delay_,
53 base::Bind(&SSLErrorHandler::OnTimerExpired,
54 base::Unretained(this)));
55 #else
56 ShowSSLInterstitial();
57 #endif
58 }
59
60 void SSLErrorHandler::CheckForCaptivePortal() {
61 #if defined(ENABLE_CAPTIVE_PORTAL_DETECTION)
62 Profile* profile = Profile::FromBrowserContext(
63 web_contents_->GetBrowserContext());
64 CaptivePortalService* captive_portal_service =
65 CaptivePortalServiceFactory::GetForProfile(profile);
66 captive_portal_detection_enabled_ = captive_portal_service->enabled();
67 captive_portal_service->DetectCaptivePortal();
68 registrar_.Add(this,
69 chrome::NOTIFICATION_CAPTIVE_PORTAL_CHECK_RESULT,
70 content::Source<Profile>(profile));
71 #endif
72 }
73
74 void SSLErrorHandler::Observe(
75 int type,
76 const content::NotificationSource& source,
77 const content::NotificationDetails& details) {
78 // TODO(meacer): Refactor this method in SSLBlockingPage.
79 #if defined(ENABLE_CAPTIVE_PORTAL_DETECTION)
80 // When detection is disabled, captive portal service always sends
81 // RESULT_INTERNET_CONNECTED. Ignore any probe results in that case.
82 if (!captive_portal_detection_enabled_)
83 return;
mmenke 2014/06/17 19:17:03 Why is this needed? Doesn't look like we're recor
meacer 2014/06/18 21:23:08 Done.
84 if (type == chrome::NOTIFICATION_CAPTIVE_PORTAL_CHECK_RESULT) {
85 CaptivePortalService::Results* results =
86 content::Details<CaptivePortalService::Results>(details).ptr();
87 bool captive_portal_detected =
88 (results->result == captive_portal::RESULT_BEHIND_CAPTIVE_PORTAL);
89 if (captive_portal_detected)
90 OnCaptivePortalResult();
mmenke 2014/06/17 19:17:03 Think it's a little weird that we just always wait
meacer 2014/06/18 21:23:08 If portal detection isn't enabled, we immediately
91 }
92 #endif
93 }
94
95 void SSLErrorHandler::OnCaptivePortalResult() {
96 if (handled_ || !timer_.IsRunning())
97 return;
98 timer_.Stop();
99 ShowCaptivePortalInterstitial();
100 handled_ = true;
101 }
102
103 void SSLErrorHandler::OnTimerExpired() {
104 if (handled_)
105 return;
106 ShowSSLInterstitial();
107 handled_ = true;
108 }
109
110 void SSLErrorHandler::ShowCaptivePortalInterstitial() {
111 // Show captive portal blocking page. The interstitial owns the blocking page.
112 new CaptivePortalBlockingPage(web_contents_, request_url_);
113 }
114
115 void SSLErrorHandler::ShowSSLInterstitial() {
116 // Show SSL blocking page. The interstitial owns the blocking page.
117 new SSLBlockingPage(web_contents_, cert_error_, ssl_info_, request_url_,
118 overridable_, strict_enforcement_, callback_);
119 }
120
121 void SSLErrorHandler::DidStopLoading(
122 content::RenderViewHost* render_view_host) {
123 timer_.Stop();
124 delete this;
125 }
126
127 void SSLErrorHandler::WebContentsDestroyed() {
128 timer_.Stop();
129 delete this;
130 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698