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

Side by Side Diff: chrome/browser/chromeos/net/network_portal_detector_impl.cc

Issue 14134007: NetworkPortalDetector/NetworkStateInformer: Switch over to use NetworkStateHandler (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebase Created 7 years, 7 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
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/chromeos/net/network_portal_detector_impl.h" 5 #include "chrome/browser/chromeos/net/network_portal_detector_impl.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/command_line.h" 8 #include "base/command_line.h"
9 #include "base/logging.h" 9 #include "base/logging.h"
10 #include "base/message_loop.h" 10 #include "base/message_loop.h"
11 #include "base/metrics/histogram.h" 11 #include "base/metrics/histogram.h"
12 #include "chrome/browser/chromeos/cros/cros_library.h" 12 #include "chrome/browser/chromeos/cros/cros_library.h"
13 #include "chrome/common/chrome_notification_types.h" 13 #include "chrome/common/chrome_notification_types.h"
14 #include "chrome/common/chrome_switches.h" 14 #include "chrome/common/chrome_switches.h"
15 #include "chromeos/network/network_state.h"
16 #include "chromeos/network/network_state_handler.h"
15 #include "content/public/browser/notification_service.h" 17 #include "content/public/browser/notification_service.h"
16 #include "grit/generated_resources.h" 18 #include "grit/generated_resources.h"
17 #include "net/http/http_status_code.h" 19 #include "net/http/http_status_code.h"
20 #include "third_party/cros_system_api/dbus/service_constants.h"
18 #include "ui/base/l10n/l10n_util.h" 21 #include "ui/base/l10n/l10n_util.h"
19 22
20 using captive_portal::CaptivePortalDetector; 23 using captive_portal::CaptivePortalDetector;
21 24
22 namespace chromeos { 25 namespace chromeos {
23 26
24 namespace { 27 namespace {
25 28
26 // Maximum number of portal detections for the same active network 29 // Maximum number of portal detections for the same default network
27 // after network change. 30 // after network change.
28 const int kMaxRequestAttempts = 3; 31 const int kMaxRequestAttempts = 3;
29 32
30 // Minimum timeout between consecutive portal checks for the same 33 // Minimum timeout between consecutive portal checks for the same
31 // network. 34 // network.
32 const int kMinTimeBetweenAttemptsSec = 3; 35 const int kMinTimeBetweenAttemptsSec = 3;
33 36
34 // Timeout for a portal check. 37 // Timeout for a portal check.
35 const int kRequestTimeoutSec = 5; 38 const int kRequestTimeoutSec = 5;
36 39
(...skipping 21 matching lines...) Expand all
58 case NetworkPortalDetectorImpl::CAPTIVE_PORTAL_STATUS_PROXY_AUTH_REQUIRED: 61 case NetworkPortalDetectorImpl::CAPTIVE_PORTAL_STATUS_PROXY_AUTH_REQUIRED:
59 return l10n_util::GetStringUTF8( 62 return l10n_util::GetStringUTF8(
60 IDS_CHROMEOS_CAPTIVE_PORTAL_STATUS_PROXY_AUTH_REQUIRED); 63 IDS_CHROMEOS_CAPTIVE_PORTAL_STATUS_PROXY_AUTH_REQUIRED);
61 case NetworkPortalDetectorImpl::CAPTIVE_PORTAL_STATUS_COUNT: 64 case NetworkPortalDetectorImpl::CAPTIVE_PORTAL_STATUS_COUNT:
62 NOTREACHED(); 65 NOTREACHED();
63 } 66 }
64 return l10n_util::GetStringUTF8( 67 return l10n_util::GetStringUTF8(
65 IDS_CHROMEOS_CAPTIVE_PORTAL_STATUS_UNRECOGNIZED); 68 IDS_CHROMEOS_CAPTIVE_PORTAL_STATUS_UNRECOGNIZED);
66 } 69 }
67 70
68 NetworkLibrary* GetNetworkLibrary() {
69 CHECK(CrosLibrary::Get());
70 return CrosLibrary::Get()->GetNetworkLibrary();
71 }
72
73 const Network* GetActiveNetwork() {
74 NetworkLibrary* cros = GetNetworkLibrary();
75 if (!cros)
76 return NULL;
77 return cros->active_network();
78 }
79
80 const Network* FindNetworkByPath(const std::string& service_path) {
81 NetworkLibrary* cros = GetNetworkLibrary();
82 if (!cros)
83 return NULL;
84 return cros->FindNetworkByPath(service_path);
85 }
86
87 } // namespace 71 } // namespace
88 72
89 NetworkPortalDetectorImpl::NetworkPortalDetectorImpl( 73 NetworkPortalDetectorImpl::NetworkPortalDetectorImpl(
90 const scoped_refptr<net::URLRequestContextGetter>& request_context) 74 const scoped_refptr<net::URLRequestContextGetter>& request_context)
91 : active_connection_state_(STATE_UNKNOWN), 75 : test_url_(CaptivePortalDetector::kDefaultURL),
92 test_url_(CaptivePortalDetector::kDefaultURL),
93 enabled_(false), 76 enabled_(false),
94 weak_ptr_factory_(this), 77 weak_ptr_factory_(this),
95 attempt_count_(0), 78 attempt_count_(0),
96 lazy_detection_enabled_(false), 79 lazy_detection_enabled_(false),
97 lazy_check_interval_(base::TimeDelta::FromSeconds(kLazyCheckIntervalSec)), 80 lazy_check_interval_(base::TimeDelta::FromSeconds(kLazyCheckIntervalSec)),
98 min_time_between_attempts_( 81 min_time_between_attempts_(
99 base::TimeDelta::FromSeconds(kMinTimeBetweenAttemptsSec)), 82 base::TimeDelta::FromSeconds(kMinTimeBetweenAttemptsSec)),
100 request_timeout_(base::TimeDelta::FromSeconds(kRequestTimeoutSec)) { 83 request_timeout_(base::TimeDelta::FromSeconds(kRequestTimeoutSec)) {
101 captive_portal_detector_.reset(new CaptivePortalDetector(request_context)); 84 captive_portal_detector_.reset(new CaptivePortalDetector(request_context));
102 85
103 registrar_.Add(this, 86 registrar_.Add(this,
104 chrome::NOTIFICATION_LOGIN_PROXY_CHANGED, 87 chrome::NOTIFICATION_LOGIN_PROXY_CHANGED,
105 content::NotificationService::AllSources()); 88 content::NotificationService::AllSources());
106 registrar_.Add(this, 89 registrar_.Add(this,
107 chrome::NOTIFICATION_AUTH_SUPPLIED, 90 chrome::NOTIFICATION_AUTH_SUPPLIED,
108 content::NotificationService::AllSources()); 91 content::NotificationService::AllSources());
109 registrar_.Add(this, 92 registrar_.Add(this,
110 chrome::NOTIFICATION_AUTH_CANCELLED, 93 chrome::NOTIFICATION_AUTH_CANCELLED,
111 content::NotificationService::AllSources()); 94 content::NotificationService::AllSources());
112 } 95 }
113 96
114 NetworkPortalDetectorImpl::~NetworkPortalDetectorImpl() { 97 NetworkPortalDetectorImpl::~NetworkPortalDetectorImpl() {
115 } 98 }
116 99
117 void NetworkPortalDetectorImpl::Init() { 100 void NetworkPortalDetectorImpl::Init() {
118 DCHECK(CalledOnValidThread()); 101 DCHECK(CalledOnValidThread());
119 102
120 state_ = STATE_IDLE; 103 state_ = STATE_IDLE;
121 chromeos::NetworkLibrary* network_library = GetNetworkLibrary(); 104 DCHECK(NetworkStateHandler::Get());
stevenjb 2013/05/14 15:46:16 nit: This is redundant. The line below will CHECK
gauravsh 2013/05/14 21:51:15 Done.
122 DCHECK(network_library); 105 NetworkStateHandler::Get()->AddObserver(this);
123 network_library->AddNetworkManagerObserver(this);
124 network_library->RemoveObserverForAllNetworks(this);
125 } 106 }
126 107
127 void NetworkPortalDetectorImpl::Shutdown() { 108 void NetworkPortalDetectorImpl::Shutdown() {
128 DCHECK(CalledOnValidThread()); 109 DCHECK(CalledOnValidThread());
129 110
130 detection_task_.Cancel(); 111 detection_task_.Cancel();
131 detection_timeout_.Cancel(); 112 detection_timeout_.Cancel();
132 113
133 captive_portal_detector_->Cancel(); 114 captive_portal_detector_->Cancel();
134 captive_portal_detector_.reset(); 115 captive_portal_detector_.reset();
135 observers_.Clear(); 116 observers_.Clear();
136 chromeos::NetworkLibrary* network_library = GetNetworkLibrary(); 117 if (NetworkStateHandler::Get())
stevenjb 2013/05/14 15:46:16 Use NetworkStateHandler::IsInitialized(). Get() wi
gauravsh 2013/05/14 21:51:15 Done.
137 if (network_library) 118 NetworkStateHandler::Get()->RemoveObserver(this);
138 network_library->RemoveNetworkManagerObserver(this);
139 } 119 }
140 120
141 void NetworkPortalDetectorImpl::AddObserver(Observer* observer) { 121 void NetworkPortalDetectorImpl::AddObserver(Observer* observer) {
142 DCHECK(CalledOnValidThread()); 122 DCHECK(CalledOnValidThread());
143 if (!observer || observers_.HasObserver(observer)) 123 if (!observer || observers_.HasObserver(observer))
144 return; 124 return;
145 observers_.AddObserver(observer); 125 observers_.AddObserver(observer);
146 } 126 }
147 127
148 void NetworkPortalDetectorImpl::AddAndFireObserver(Observer* observer) { 128 void NetworkPortalDetectorImpl::AddAndFireObserver(Observer* observer) {
149 DCHECK(CalledOnValidThread()); 129 DCHECK(CalledOnValidThread());
150 if (!observer) 130 if (!observer)
151 return; 131 return;
152 AddObserver(observer); 132 AddObserver(observer);
153 const Network* network = GetActiveNetwork(); 133 const NetworkState* network = NetworkStateHandler::Get()->DefaultNetwork();
154 observer->OnPortalDetectionCompleted(network, GetCaptivePortalState(network)); 134 observer->OnPortalDetectionCompleted(network, GetCaptivePortalState(network));
155 } 135 }
156 136
157 void NetworkPortalDetectorImpl::RemoveObserver(Observer* observer) { 137 void NetworkPortalDetectorImpl::RemoveObserver(Observer* observer) {
158 DCHECK(CalledOnValidThread()); 138 DCHECK(CalledOnValidThread());
159 if (observer) 139 if (observer)
160 observers_.RemoveObserver(observer); 140 observers_.RemoveObserver(observer);
161 } 141 }
162 142
163 bool NetworkPortalDetectorImpl::IsEnabled() { 143 bool NetworkPortalDetectorImpl::IsEnabled() {
164 return enabled_; 144 return enabled_;
165 } 145 }
166 146
167 void NetworkPortalDetectorImpl::Enable(bool start_detection) { 147 void NetworkPortalDetectorImpl::Enable(bool start_detection) {
168 DCHECK(CalledOnValidThread()); 148 DCHECK(CalledOnValidThread());
169 if (enabled_) 149 if (enabled_)
170 return; 150 return;
171 enabled_ = true; 151 enabled_ = true;
172 DCHECK(!IsPortalCheckPending()); 152 DCHECK(!IsPortalCheckPending());
173 DCHECK(!IsCheckingForPortal()); 153 DCHECK(!IsCheckingForPortal());
174 DCHECK(!lazy_detection_enabled_); 154 DCHECK(!lazy_detection_enabled_);
175 if (!start_detection) 155 if (!start_detection)
176 return; 156 return;
177 state_ = STATE_IDLE; 157 state_ = STATE_IDLE;
178 attempt_count_ = 0; 158 attempt_count_ = 0;
179 const Network* active_network = GetActiveNetwork(); 159 const NetworkState* default_network =
180 if (!active_network) 160 NetworkStateHandler::Get()->DefaultNetwork();
161 if (!default_network)
181 return; 162 return;
182 portal_state_map_.erase(active_network->service_path()); 163 portal_state_map_.erase(default_network->path());
183 DetectCaptivePortal(base::TimeDelta()); 164 DetectCaptivePortal(base::TimeDelta());
184 } 165 }
185 166
186 NetworkPortalDetectorImpl::CaptivePortalState 167 NetworkPortalDetectorImpl::CaptivePortalState
187 NetworkPortalDetectorImpl::GetCaptivePortalState(const Network* network) { 168 NetworkPortalDetectorImpl::GetCaptivePortalState(const NetworkState* network) {
188 DCHECK(CalledOnValidThread()); 169 DCHECK(CalledOnValidThread());
189 if (!network) 170 if (!network)
190 return CaptivePortalState(); 171 return CaptivePortalState();
191 CaptivePortalStateMap::const_iterator it = 172 CaptivePortalStateMap::const_iterator it =
192 portal_state_map_.find(network->service_path()); 173 portal_state_map_.find(network->path());
193 if (it == portal_state_map_.end()) 174 if (it == portal_state_map_.end())
194 return CaptivePortalState(); 175 return CaptivePortalState();
195 return it->second; 176 return it->second;
196 } 177 }
197 178
198 void NetworkPortalDetectorImpl::EnableLazyDetection() { 179 void NetworkPortalDetectorImpl::EnableLazyDetection() {
199 if (lazy_detection_enabled_) 180 if (lazy_detection_enabled_)
200 return; 181 return;
201 VLOG(1) << "Lazy detection mode enabled."; 182 VLOG(1) << "Lazy detection mode enabled.";
202 lazy_detection_enabled_ = true; 183 lazy_detection_enabled_ = true;
203 if (!IsPortalCheckPending() && !IsCheckingForPortal()) 184 if (!IsPortalCheckPending() && !IsCheckingForPortal())
204 DetectCaptivePortal(base::TimeDelta()); 185 DetectCaptivePortal(base::TimeDelta());
205 } 186 }
206 187
207 void NetworkPortalDetectorImpl::DisableLazyDetection() { 188 void NetworkPortalDetectorImpl::DisableLazyDetection() {
208 if (!lazy_detection_enabled_) 189 if (!lazy_detection_enabled_)
209 return; 190 return;
210 VLOG(1) << "Lazy detection mode disabled."; 191 VLOG(1) << "Lazy detection mode disabled.";
211 lazy_detection_enabled_ = false; 192 lazy_detection_enabled_ = false;
212 } 193 }
213 194
214 void NetworkPortalDetectorImpl::OnNetworkManagerChanged(NetworkLibrary* cros) { 195 void NetworkPortalDetectorImpl::NetworkManagerChanged() {
215 DCHECK(CalledOnValidThread()); 196 DCHECK(CalledOnValidThread());
216 CHECK(cros); 197 const NetworkState* default_network =
217 const Network* active_network = cros->active_network(); 198 NetworkStateHandler::Get()->DefaultNetwork();
218 if (!active_network) 199 if (!default_network)
219 return; 200 return;
220 201
221 active_network_id_ = active_network->unique_id(); 202 default_network_id_ = default_network->guid();
222 203
223 bool network_changed = 204 bool network_changed = (default_service_path_ != default_network->path());
224 (active_service_path_ != active_network->service_path()); 205 if (network_changed)
225 if (network_changed) { 206 default_service_path_ = default_network->path();
stevenjb 2013/05/14 15:46:16 nit: Skip if() here (or add if() above line 210 fo
gauravsh 2013/05/14 21:51:15 Done.
226 if (!active_service_path_.empty())
227 cros->RemoveNetworkObserver(active_service_path_, this);
228 active_service_path_ = active_network->service_path();
229 cros->AddNetworkObserver(active_service_path_, this);
230 }
231 207
232 bool connection_state_changed = 208 bool connection_state_changed = (default_connection_state_ !=
233 (active_connection_state_ != active_network->connection_state()); 209 default_network->connection_state());
234 active_connection_state_ = active_network->connection_state(); 210 default_connection_state_ = default_network->connection_state();
235 211
236 if (network_changed || connection_state_changed) { 212 if (network_changed || connection_state_changed) {
237 attempt_count_ = 0; 213 attempt_count_ = 0;
238 CancelPortalDetection(); 214 CancelPortalDetection();
239 } 215 }
240 216
241 if (!IsCheckingForPortal() && !IsPortalCheckPending() && 217 if (!IsCheckingForPortal() && !IsPortalCheckPending() &&
242 Network::IsConnectedState(active_connection_state_) && 218 NetworkState::StateIsConnected(default_connection_state_) &&
243 (attempt_count_ < kMaxRequestAttempts || lazy_detection_enabled_)) { 219 (attempt_count_ < kMaxRequestAttempts || lazy_detection_enabled_)) {
244 DCHECK(active_network); 220 DCHECK(default_network);
stevenjb 2013/05/14 15:46:16 This DCHECK is redundant
gauravsh 2013/05/14 21:51:15 Done.
245 221
246 // Initiate Captive Portal detection if network's captive 222 // Initiate Captive Portal detection if network's captive
247 // portal state is unknown (e.g. for freshly created networks), 223 // portal state is unknown (e.g. for freshly created networks),
248 // offline or if network connection state was changed. 224 // offline or if network connection state was changed.
249 CaptivePortalState state = GetCaptivePortalState(active_network); 225 CaptivePortalState state = GetCaptivePortalState(default_network);
250 if (state.status == CAPTIVE_PORTAL_STATUS_UNKNOWN || 226 if (state.status == CAPTIVE_PORTAL_STATUS_UNKNOWN ||
251 state.status == CAPTIVE_PORTAL_STATUS_OFFLINE || 227 state.status == CAPTIVE_PORTAL_STATUS_OFFLINE ||
252 (!network_changed && connection_state_changed)) { 228 (!network_changed && connection_state_changed)) {
253 DetectCaptivePortal(base::TimeDelta()); 229 DetectCaptivePortal(base::TimeDelta());
254 } 230 }
255 } 231 }
256 } 232 }
257 233
258 void NetworkPortalDetectorImpl::OnNetworkChanged( 234 void NetworkPortalDetectorImpl::DefaultNetworkChanged(
259 chromeos::NetworkLibrary* cros, 235 const NetworkState* network) {
260 const chromeos::Network* network) { 236 NetworkManagerChanged();
261 DCHECK(CalledOnValidThread());
262 OnNetworkManagerChanged(cros);
263 } 237 }
264 238
265 void NetworkPortalDetectorImpl::DetectCaptivePortal( 239 void NetworkPortalDetectorImpl::DetectCaptivePortal(
266 const base::TimeDelta& delay) { 240 const base::TimeDelta& delay) {
267 DCHECK(!IsPortalCheckPending()); 241 DCHECK(!IsPortalCheckPending());
268 DCHECK(!IsCheckingForPortal()); 242 DCHECK(!IsCheckingForPortal());
269 DCHECK(attempt_count_ < kMaxRequestAttempts || lazy_detection_enabled_); 243 DCHECK(attempt_count_ < kMaxRequestAttempts || lazy_detection_enabled_);
270 244
271 if (!IsEnabled()) 245 if (!IsEnabled())
272 return; 246 return;
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
304 278
305 void NetworkPortalDetectorImpl::DetectCaptivePortalTask() { 279 void NetworkPortalDetectorImpl::DetectCaptivePortalTask() {
306 DCHECK(IsPortalCheckPending()); 280 DCHECK(IsPortalCheckPending());
307 281
308 state_ = STATE_CHECKING_FOR_PORTAL; 282 state_ = STATE_CHECKING_FOR_PORTAL;
309 attempt_start_time_ = GetCurrentTimeTicks(); 283 attempt_start_time_ = GetCurrentTimeTicks();
310 284
311 if (attempt_count_ < kMaxRequestAttempts) { 285 if (attempt_count_ < kMaxRequestAttempts) {
312 ++attempt_count_; 286 ++attempt_count_;
313 VLOG(1) << "Portal detection started: " 287 VLOG(1) << "Portal detection started: "
314 << "network=" << active_network_id_ << ", " 288 << "network=" << default_network_id_ << ", "
315 << "attempt=" << attempt_count_ << " of " << kMaxRequestAttempts; 289 << "attempt=" << attempt_count_ << " of " << kMaxRequestAttempts;
316 } else { 290 } else {
317 DCHECK(lazy_detection_enabled_); 291 DCHECK(lazy_detection_enabled_);
318 VLOG(1) << "Lazy portal detection attempt started"; 292 VLOG(1) << "Lazy portal detection attempt started";
319 } 293 }
320 294
321 captive_portal_detector_->DetectCaptivePortal( 295 captive_portal_detector_->DetectCaptivePortal(
322 test_url_, 296 test_url_,
323 base::Bind(&NetworkPortalDetectorImpl::OnPortalDetectionCompleted, 297 base::Bind(&NetworkPortalDetectorImpl::OnPortalDetectionCompleted,
324 weak_ptr_factory_.GetWeakPtr())); 298 weak_ptr_factory_.GetWeakPtr()));
325 detection_timeout_.Reset( 299 detection_timeout_.Reset(
326 base::Bind(&NetworkPortalDetectorImpl::PortalDetectionTimeout, 300 base::Bind(&NetworkPortalDetectorImpl::PortalDetectionTimeout,
327 weak_ptr_factory_.GetWeakPtr())); 301 weak_ptr_factory_.GetWeakPtr()));
328 MessageLoop::current()->PostDelayedTask(FROM_HERE, 302 MessageLoop::current()->PostDelayedTask(FROM_HERE,
329 detection_timeout_.callback(), 303 detection_timeout_.callback(),
330 request_timeout_); 304 request_timeout_);
331 } 305 }
332 306
333 void NetworkPortalDetectorImpl::PortalDetectionTimeout() { 307 void NetworkPortalDetectorImpl::PortalDetectionTimeout() {
334 DCHECK(CalledOnValidThread()); 308 DCHECK(CalledOnValidThread());
335 DCHECK(IsCheckingForPortal()); 309 DCHECK(IsCheckingForPortal());
336 310
337 VLOG(1) << "Portal detection timeout: network=" << active_network_id_; 311 VLOG(1) << "Portal detection timeout: network=" << default_network_id_;
338 312
339 captive_portal_detector_->Cancel(); 313 captive_portal_detector_->Cancel();
340 CaptivePortalDetector::Results results; 314 CaptivePortalDetector::Results results;
341 results.result = captive_portal::RESULT_NO_RESPONSE; 315 results.result = captive_portal::RESULT_NO_RESPONSE;
342 OnPortalDetectionCompleted(results); 316 OnPortalDetectionCompleted(results);
343 } 317 }
344 318
345 void NetworkPortalDetectorImpl::CancelPortalDetection() { 319 void NetworkPortalDetectorImpl::CancelPortalDetection() {
346 if (IsPortalCheckPending()) 320 if (IsPortalCheckPending())
347 detection_task_.Cancel(); 321 detection_task_.Cancel();
348 else if (IsCheckingForPortal()) 322 else if (IsCheckingForPortal())
349 captive_portal_detector_->Cancel(); 323 captive_portal_detector_->Cancel();
350 detection_timeout_.Cancel(); 324 detection_timeout_.Cancel();
351 state_ = STATE_IDLE; 325 state_ = STATE_IDLE;
352 } 326 }
353 327
354 void NetworkPortalDetectorImpl::OnPortalDetectionCompleted( 328 void NetworkPortalDetectorImpl::OnPortalDetectionCompleted(
355 const CaptivePortalDetector::Results& results) { 329 const CaptivePortalDetector::Results& results) {
356 DCHECK(CalledOnValidThread()); 330 DCHECK(CalledOnValidThread());
357 DCHECK(IsCheckingForPortal()); 331 DCHECK(IsCheckingForPortal());
358 332
359 VLOG(1) << "Portal detection completed: " 333 VLOG(1) << "Portal detection completed: "
360 << "network=" << active_network_id_ << ", " 334 << "network=" << default_network_id_ << ", "
361 << "result=" << CaptivePortalDetector::CaptivePortalResultToString( 335 << "result=" << CaptivePortalDetector::CaptivePortalResultToString(
362 results.result) << ", " 336 results.result) << ", "
363 << "response_code=" << results.response_code; 337 << "response_code=" << results.response_code;
364 338
365 state_ = STATE_IDLE; 339 state_ = STATE_IDLE;
366 detection_timeout_.Cancel(); 340 detection_timeout_.Cancel();
367 341
368 NetworkLibrary* cros = GetNetworkLibrary(); 342 const NetworkState* default_network =
369 const Network* active_network = cros->active_network(); 343 NetworkStateHandler::Get()->DefaultNetwork();
370 if (!active_network) { 344 if (!default_network) {
371 TryLazyDetection(); 345 TryLazyDetection();
372 return; 346 return;
373 } 347 }
374 348
375 CaptivePortalState state; 349 CaptivePortalState state;
376 state.response_code = results.response_code; 350 state.response_code = results.response_code;
377 switch (results.result) { 351 switch (results.result) {
378 case captive_portal::RESULT_NO_RESPONSE: 352 case captive_portal::RESULT_NO_RESPONSE:
379 if (attempt_count_ >= kMaxRequestAttempts) { 353 if (attempt_count_ >= kMaxRequestAttempts) {
380 if (state.response_code == net::HTTP_PROXY_AUTHENTICATION_REQUIRED) { 354 if (state.response_code == net::HTTP_PROXY_AUTHENTICATION_REQUIRED) {
381 state.status = CAPTIVE_PORTAL_STATUS_PROXY_AUTH_REQUIRED; 355 state.status = CAPTIVE_PORTAL_STATUS_PROXY_AUTH_REQUIRED;
382 } else if (active_network->restricted_pool()) { 356 } else if (default_network->connection_state() ==
357 flimflam::kStatePortal) {
383 // Take into account shill's detection results. 358 // Take into account shill's detection results.
384 state.status = CAPTIVE_PORTAL_STATUS_PORTAL; 359 state.status = CAPTIVE_PORTAL_STATUS_PORTAL;
385 LOG(WARNING) << "Network " << active_network->unique_id() << " " 360 LOG(WARNING) << "Network " << default_network->guid() << " "
386 << "is marked as " 361 << "is marked as "
387 << CaptivePortalStatusString(state.status) << " " 362 << CaptivePortalStatusString(state.status) << " "
388 << "despite the fact that CaptivePortalDetector " 363 << "despite the fact that CaptivePortalDetector "
389 << "received no response"; 364 << "received no response";
390 } else { 365 } else {
391 state.status = CAPTIVE_PORTAL_STATUS_OFFLINE; 366 state.status = CAPTIVE_PORTAL_STATUS_OFFLINE;
392 } 367 }
393 SetCaptivePortalState(active_network, state); 368 SetCaptivePortalState(default_network, state);
394 } else { 369 } else {
395 DetectCaptivePortal(results.retry_after_delta); 370 DetectCaptivePortal(results.retry_after_delta);
396 } 371 }
397 break; 372 break;
398 case captive_portal::RESULT_INTERNET_CONNECTED: 373 case captive_portal::RESULT_INTERNET_CONNECTED:
399 state.status = CAPTIVE_PORTAL_STATUS_ONLINE; 374 state.status = CAPTIVE_PORTAL_STATUS_ONLINE;
400 SetCaptivePortalState(active_network, state); 375 SetCaptivePortalState(default_network, state);
401 break; 376 break;
402 case captive_portal::RESULT_BEHIND_CAPTIVE_PORTAL: 377 case captive_portal::RESULT_BEHIND_CAPTIVE_PORTAL:
403 state.status = CAPTIVE_PORTAL_STATUS_PORTAL; 378 state.status = CAPTIVE_PORTAL_STATUS_PORTAL;
404 SetCaptivePortalState(active_network, state); 379 SetCaptivePortalState(default_network, state);
405 break; 380 break;
406 default: 381 default:
407 break; 382 break;
408 } 383 }
409 384
410 TryLazyDetection(); 385 TryLazyDetection();
411 } 386 }
412 387
413 void NetworkPortalDetectorImpl::TryLazyDetection() { 388 void NetworkPortalDetectorImpl::TryLazyDetection() {
414 if (!IsPortalCheckPending() && !IsCheckingForPortal() && 389 if (!IsPortalCheckPending() && !IsCheckingForPortal() &&
(...skipping 20 matching lines...) Expand all
435 410
436 bool NetworkPortalDetectorImpl::IsPortalCheckPending() const { 411 bool NetworkPortalDetectorImpl::IsPortalCheckPending() const {
437 return state_ == STATE_PORTAL_CHECK_PENDING; 412 return state_ == STATE_PORTAL_CHECK_PENDING;
438 } 413 }
439 414
440 bool NetworkPortalDetectorImpl::IsCheckingForPortal() const { 415 bool NetworkPortalDetectorImpl::IsCheckingForPortal() const {
441 return state_ == STATE_CHECKING_FOR_PORTAL; 416 return state_ == STATE_CHECKING_FOR_PORTAL;
442 } 417 }
443 418
444 void NetworkPortalDetectorImpl::SetCaptivePortalState( 419 void NetworkPortalDetectorImpl::SetCaptivePortalState(
445 const Network* network, 420 const NetworkState* network,
446 const CaptivePortalState& state) { 421 const CaptivePortalState& state) {
447 DCHECK(network); 422 DCHECK(network);
448 423
449 if (!detection_start_time_.is_null()) { 424 if (!detection_start_time_.is_null()) {
450 UMA_HISTOGRAM_TIMES("CaptivePortal.OOBE.DetectionDuration", 425 UMA_HISTOGRAM_TIMES("CaptivePortal.OOBE.DetectionDuration",
451 GetCurrentTimeTicks() - detection_start_time_); 426 GetCurrentTimeTicks() - detection_start_time_);
452 } 427 }
453 428
454 CaptivePortalStateMap::const_iterator it = 429 CaptivePortalStateMap::const_iterator it =
455 portal_state_map_.find(network->service_path()); 430 portal_state_map_.find(network->path());
456 if (it == portal_state_map_.end() || 431 if (it == portal_state_map_.end() ||
457 it->second.status != state.status || 432 it->second.status != state.status ||
458 it->second.response_code != state.response_code) { 433 it->second.response_code != state.response_code) {
459 VLOG(1) << "Updating Chrome Captive Portal state: " 434 VLOG(1) << "Updating Chrome Captive Portal state: "
460 << "network=" << network->unique_id() << ", " 435 << "network=" << network->guid() << ", "
461 << "status=" << CaptivePortalStatusString(state.status) << ", " 436 << "status=" << CaptivePortalStatusString(state.status) << ", "
462 << "response_code=" << state.response_code; 437 << "response_code=" << state.response_code;
463 portal_state_map_[network->service_path()] = state; 438 portal_state_map_[network->path()] = state;
464 } 439 }
465 NotifyPortalDetectionCompleted(network, state); 440 NotifyPortalDetectionCompleted(network, state);
466 } 441 }
467 442
468 void NetworkPortalDetectorImpl::NotifyPortalDetectionCompleted( 443 void NetworkPortalDetectorImpl::NotifyPortalDetectionCompleted(
469 const Network* network, 444 const NetworkState* network,
470 const CaptivePortalState& state) { 445 const CaptivePortalState& state) {
471 FOR_EACH_OBSERVER(Observer, observers_, 446 FOR_EACH_OBSERVER(Observer, observers_,
472 OnPortalDetectionCompleted(network, state)); 447 OnPortalDetectionCompleted(network, state));
473 } 448 }
474 449
475 base::TimeTicks NetworkPortalDetectorImpl::GetCurrentTimeTicks() const { 450 base::TimeTicks NetworkPortalDetectorImpl::GetCurrentTimeTicks() const {
476 if (time_ticks_for_testing_.is_null()) 451 if (time_ticks_for_testing_.is_null())
477 return base::TimeTicks::Now(); 452 return base::TimeTicks::Now();
478 else 453 else
479 return time_ticks_for_testing_; 454 return time_ticks_for_testing_;
480 } 455 }
481 456
482 bool NetworkPortalDetectorImpl::DetectionTimeoutIsCancelledForTesting() const { 457 bool NetworkPortalDetectorImpl::DetectionTimeoutIsCancelledForTesting() const {
483 return detection_timeout_.IsCancelled(); 458 return detection_timeout_.IsCancelled();
484 } 459 }
485 460
486 } // namespace chromeos 461 } // namespace chromeos
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698