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

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 again 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 NetworkStateHandler::Get()->AddObserver(this);
122 DCHECK(network_library);
123 network_library->AddNetworkManagerObserver(this);
124 network_library->RemoveObserverForAllNetworks(this);
125 } 105 }
126 106
127 void NetworkPortalDetectorImpl::Shutdown() { 107 void NetworkPortalDetectorImpl::Shutdown() {
128 DCHECK(CalledOnValidThread()); 108 DCHECK(CalledOnValidThread());
129 109
130 detection_task_.Cancel(); 110 detection_task_.Cancel();
131 detection_timeout_.Cancel(); 111 detection_timeout_.Cancel();
132 112
133 captive_portal_detector_->Cancel(); 113 captive_portal_detector_->Cancel();
134 captive_portal_detector_.reset(); 114 captive_portal_detector_.reset();
135 observers_.Clear(); 115 observers_.Clear();
136 chromeos::NetworkLibrary* network_library = GetNetworkLibrary(); 116 if (NetworkStateHandler::IsInitialized())
137 if (network_library) 117 NetworkStateHandler::Get()->RemoveObserver(this);
138 network_library->RemoveNetworkManagerObserver(this);
139 } 118 }
140 119
141 void NetworkPortalDetectorImpl::AddObserver(Observer* observer) { 120 void NetworkPortalDetectorImpl::AddObserver(Observer* observer) {
142 DCHECK(CalledOnValidThread()); 121 DCHECK(CalledOnValidThread());
143 if (!observer || observers_.HasObserver(observer)) 122 if (!observer || observers_.HasObserver(observer))
144 return; 123 return;
145 observers_.AddObserver(observer); 124 observers_.AddObserver(observer);
146 } 125 }
147 126
148 void NetworkPortalDetectorImpl::AddAndFireObserver(Observer* observer) { 127 void NetworkPortalDetectorImpl::AddAndFireObserver(Observer* observer) {
149 DCHECK(CalledOnValidThread()); 128 DCHECK(CalledOnValidThread());
150 if (!observer) 129 if (!observer)
151 return; 130 return;
152 AddObserver(observer); 131 AddObserver(observer);
153 const Network* network = GetActiveNetwork(); 132 const NetworkState* network = NetworkStateHandler::Get()->DefaultNetwork();
154 observer->OnPortalDetectionCompleted(network, GetCaptivePortalState(network)); 133 observer->OnPortalDetectionCompleted(network, GetCaptivePortalState(network));
155 } 134 }
156 135
157 void NetworkPortalDetectorImpl::RemoveObserver(Observer* observer) { 136 void NetworkPortalDetectorImpl::RemoveObserver(Observer* observer) {
158 DCHECK(CalledOnValidThread()); 137 DCHECK(CalledOnValidThread());
159 if (observer) 138 if (observer)
160 observers_.RemoveObserver(observer); 139 observers_.RemoveObserver(observer);
161 } 140 }
162 141
163 bool NetworkPortalDetectorImpl::IsEnabled() { 142 bool NetworkPortalDetectorImpl::IsEnabled() {
164 return enabled_; 143 return enabled_;
165 } 144 }
166 145
167 void NetworkPortalDetectorImpl::Enable(bool start_detection) { 146 void NetworkPortalDetectorImpl::Enable(bool start_detection) {
168 DCHECK(CalledOnValidThread()); 147 DCHECK(CalledOnValidThread());
169 if (enabled_) 148 if (enabled_)
170 return; 149 return;
171 enabled_ = true; 150 enabled_ = true;
172 DCHECK(!IsPortalCheckPending()); 151 DCHECK(!IsPortalCheckPending());
173 DCHECK(!IsCheckingForPortal()); 152 DCHECK(!IsCheckingForPortal());
174 DCHECK(!lazy_detection_enabled()); 153 DCHECK(!lazy_detection_enabled());
175 if (!start_detection) 154 if (!start_detection)
176 return; 155 return;
177 state_ = STATE_IDLE; 156 state_ = STATE_IDLE;
178 attempt_count_ = 0; 157 attempt_count_ = 0;
179 const Network* active_network = GetActiveNetwork(); 158 const NetworkState* default_network =
180 if (!active_network) 159 NetworkStateHandler::Get()->DefaultNetwork();
160 if (!default_network)
181 return; 161 return;
182 portal_state_map_.erase(active_network->service_path()); 162 portal_state_map_.erase(default_network->path());
183 DetectCaptivePortal(base::TimeDelta()); 163 DetectCaptivePortal(base::TimeDelta());
184 } 164 }
185 165
186 NetworkPortalDetectorImpl::CaptivePortalState 166 NetworkPortalDetectorImpl::CaptivePortalState
187 NetworkPortalDetectorImpl::GetCaptivePortalState(const Network* network) { 167 NetworkPortalDetectorImpl::GetCaptivePortalState(const NetworkState* network) {
188 DCHECK(CalledOnValidThread()); 168 DCHECK(CalledOnValidThread());
189 if (!network) 169 if (!network)
190 return CaptivePortalState(); 170 return CaptivePortalState();
191 CaptivePortalStateMap::const_iterator it = 171 CaptivePortalStateMap::const_iterator it =
192 portal_state_map_.find(network->service_path()); 172 portal_state_map_.find(network->path());
193 if (it == portal_state_map_.end()) 173 if (it == portal_state_map_.end())
194 return CaptivePortalState(); 174 return CaptivePortalState();
195 return it->second; 175 return it->second;
196 } 176 }
197 177
198 bool NetworkPortalDetectorImpl::StartDetectionIfIdle() { 178 bool NetworkPortalDetectorImpl::StartDetectionIfIdle() {
199 if (IsPortalCheckPending() || IsCheckingForPortal()) 179 if (IsPortalCheckPending() || IsCheckingForPortal())
200 return false; 180 return false;
201 DetectCaptivePortal(base::TimeDelta()); 181 DetectCaptivePortal(base::TimeDelta());
202 return true; 182 return true;
203 } 183 }
204 184
205 void NetworkPortalDetectorImpl::EnableLazyDetection() { 185 void NetworkPortalDetectorImpl::EnableLazyDetection() {
206 if (lazy_detection_enabled()) 186 if (lazy_detection_enabled())
207 return; 187 return;
208 lazy_detection_enabled_ = true; 188 lazy_detection_enabled_ = true;
209 VLOG(1) << "Lazy detection mode enabled."; 189 VLOG(1) << "Lazy detection mode enabled.";
210 StartDetectionIfIdle(); 190 StartDetectionIfIdle();
211 } 191 }
212 192
213 void NetworkPortalDetectorImpl::DisableLazyDetection() { 193 void NetworkPortalDetectorImpl::DisableLazyDetection() {
214 CHECK(lazy_detection_enabled()); 194 CHECK(lazy_detection_enabled());
215 lazy_detection_enabled_ = false; 195 lazy_detection_enabled_ = false;
216 VLOG(1) << "Lazy detection mode disabled."; 196 VLOG(1) << "Lazy detection mode disabled.";
217 } 197 }
218 198
219 void NetworkPortalDetectorImpl::OnNetworkManagerChanged(NetworkLibrary* cros) { 199 void NetworkPortalDetectorImpl::NetworkManagerChanged() {
220 DCHECK(CalledOnValidThread()); 200 DCHECK(CalledOnValidThread());
221 CHECK(cros); 201 const NetworkState* default_network =
222 const Network* active_network = cros->active_network(); 202 NetworkStateHandler::Get()->DefaultNetwork();
223 if (!active_network) { 203 if (!default_network) {
224 active_network_id_.clear(); 204 default_network_id_.clear();
225 return; 205 return;
226 } 206 }
227 207
228 active_network_id_ = active_network->unique_id(); 208 default_network_id_ = default_network->guid();
229 209
230 bool network_changed = 210 bool network_changed = (default_service_path_ != default_network->path());
231 (active_service_path_ != active_network->service_path()); 211 default_service_path_ = default_network->path();
232 if (network_changed) {
233 if (!active_service_path_.empty())
234 cros->RemoveNetworkObserver(active_service_path_, this);
235 active_service_path_ = active_network->service_path();
236 cros->AddNetworkObserver(active_service_path_, this);
237 }
238 212
239 bool connection_state_changed = 213 bool connection_state_changed = (default_connection_state_ !=
240 (active_connection_state_ != active_network->connection_state()); 214 default_network->connection_state());
241 active_connection_state_ = active_network->connection_state(); 215 default_connection_state_ = default_network->connection_state();
242 216
243 if (network_changed || connection_state_changed) { 217 if (network_changed || connection_state_changed) {
244 attempt_count_ = 0; 218 attempt_count_ = 0;
245 CancelPortalDetection(); 219 CancelPortalDetection();
246 } 220 }
247 221
248 if (!IsCheckingForPortal() && !IsPortalCheckPending() && 222 if (!IsCheckingForPortal() && !IsPortalCheckPending() &&
249 Network::IsConnectedState(active_connection_state_) && 223 NetworkState::StateIsConnected(default_connection_state_) &&
250 (attempt_count_ < kMaxRequestAttempts || lazy_detection_enabled())) { 224 (attempt_count_ < kMaxRequestAttempts || lazy_detection_enabled())) {
251 DCHECK(active_network);
252
253 // Initiate Captive Portal detection if network's captive 225 // Initiate Captive Portal detection if network's captive
254 // portal state is unknown (e.g. for freshly created networks), 226 // portal state is unknown (e.g. for freshly created networks),
255 // offline or if network connection state was changed. 227 // offline or if network connection state was changed.
256 CaptivePortalState state = GetCaptivePortalState(active_network); 228 CaptivePortalState state = GetCaptivePortalState(default_network);
257 if (state.status == CAPTIVE_PORTAL_STATUS_UNKNOWN || 229 if (state.status == CAPTIVE_PORTAL_STATUS_UNKNOWN ||
258 state.status == CAPTIVE_PORTAL_STATUS_OFFLINE || 230 state.status == CAPTIVE_PORTAL_STATUS_OFFLINE ||
259 (!network_changed && connection_state_changed)) { 231 (!network_changed && connection_state_changed)) {
260 DetectCaptivePortal(base::TimeDelta()); 232 DetectCaptivePortal(base::TimeDelta());
261 } 233 }
262 } 234 }
263 } 235 }
264 236
265 void NetworkPortalDetectorImpl::OnNetworkChanged( 237 void NetworkPortalDetectorImpl::DefaultNetworkChanged(
266 chromeos::NetworkLibrary* cros, 238 const NetworkState* network) {
267 const chromeos::Network* network) { 239 NetworkManagerChanged();
268 DCHECK(CalledOnValidThread());
269 OnNetworkManagerChanged(cros);
270 } 240 }
271 241
272 void NetworkPortalDetectorImpl::DetectCaptivePortal( 242 void NetworkPortalDetectorImpl::DetectCaptivePortal(
273 const base::TimeDelta& delay) { 243 const base::TimeDelta& delay) {
274 DCHECK(!IsPortalCheckPending()); 244 DCHECK(!IsPortalCheckPending());
275 DCHECK(!IsCheckingForPortal()); 245 DCHECK(!IsCheckingForPortal());
276 DCHECK(attempt_count_ < kMaxRequestAttempts || lazy_detection_enabled()); 246 DCHECK(attempt_count_ < kMaxRequestAttempts || lazy_detection_enabled());
277 247
278 if (!IsEnabled()) 248 if (!IsEnabled())
279 return; 249 return;
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
311 281
312 void NetworkPortalDetectorImpl::DetectCaptivePortalTask() { 282 void NetworkPortalDetectorImpl::DetectCaptivePortalTask() {
313 DCHECK(IsPortalCheckPending()); 283 DCHECK(IsPortalCheckPending());
314 284
315 state_ = STATE_CHECKING_FOR_PORTAL; 285 state_ = STATE_CHECKING_FOR_PORTAL;
316 attempt_start_time_ = GetCurrentTimeTicks(); 286 attempt_start_time_ = GetCurrentTimeTicks();
317 287
318 if (attempt_count_ < kMaxRequestAttempts) { 288 if (attempt_count_ < kMaxRequestAttempts) {
319 ++attempt_count_; 289 ++attempt_count_;
320 VLOG(1) << "Portal detection started: " 290 VLOG(1) << "Portal detection started: "
321 << "network=" << active_network_id_ << ", " 291 << "network=" << default_network_id_ << ", "
322 << "attempt=" << attempt_count_ << " of " << kMaxRequestAttempts; 292 << "attempt=" << attempt_count_ << " of " << kMaxRequestAttempts;
323 } else { 293 } else {
324 DCHECK(lazy_detection_enabled()); 294 DCHECK(lazy_detection_enabled());
325 VLOG(1) << "Lazy portal detection attempt started"; 295 VLOG(1) << "Lazy portal detection attempt started";
326 } 296 }
327 297
328 captive_portal_detector_->DetectCaptivePortal( 298 captive_portal_detector_->DetectCaptivePortal(
329 test_url_, 299 test_url_,
330 base::Bind(&NetworkPortalDetectorImpl::OnPortalDetectionCompleted, 300 base::Bind(&NetworkPortalDetectorImpl::OnPortalDetectionCompleted,
331 weak_ptr_factory_.GetWeakPtr())); 301 weak_ptr_factory_.GetWeakPtr()));
332 detection_timeout_.Reset( 302 detection_timeout_.Reset(
333 base::Bind(&NetworkPortalDetectorImpl::PortalDetectionTimeout, 303 base::Bind(&NetworkPortalDetectorImpl::PortalDetectionTimeout,
334 weak_ptr_factory_.GetWeakPtr())); 304 weak_ptr_factory_.GetWeakPtr()));
335 MessageLoop::current()->PostDelayedTask(FROM_HERE, 305 MessageLoop::current()->PostDelayedTask(FROM_HERE,
336 detection_timeout_.callback(), 306 detection_timeout_.callback(),
337 request_timeout_); 307 request_timeout_);
338 } 308 }
339 309
340 void NetworkPortalDetectorImpl::PortalDetectionTimeout() { 310 void NetworkPortalDetectorImpl::PortalDetectionTimeout() {
341 DCHECK(CalledOnValidThread()); 311 DCHECK(CalledOnValidThread());
342 DCHECK(IsCheckingForPortal()); 312 DCHECK(IsCheckingForPortal());
343 313
344 VLOG(1) << "Portal detection timeout: network=" << active_network_id_; 314 VLOG(1) << "Portal detection timeout: network=" << default_network_id_;
345 315
346 captive_portal_detector_->Cancel(); 316 captive_portal_detector_->Cancel();
347 CaptivePortalDetector::Results results; 317 CaptivePortalDetector::Results results;
348 results.result = captive_portal::RESULT_NO_RESPONSE; 318 results.result = captive_portal::RESULT_NO_RESPONSE;
349 OnPortalDetectionCompleted(results); 319 OnPortalDetectionCompleted(results);
350 } 320 }
351 321
352 void NetworkPortalDetectorImpl::CancelPortalDetection() { 322 void NetworkPortalDetectorImpl::CancelPortalDetection() {
353 if (IsPortalCheckPending()) 323 if (IsPortalCheckPending())
354 detection_task_.Cancel(); 324 detection_task_.Cancel();
355 else if (IsCheckingForPortal()) 325 else if (IsCheckingForPortal())
356 captive_portal_detector_->Cancel(); 326 captive_portal_detector_->Cancel();
357 detection_timeout_.Cancel(); 327 detection_timeout_.Cancel();
358 state_ = STATE_IDLE; 328 state_ = STATE_IDLE;
359 } 329 }
360 330
361 void NetworkPortalDetectorImpl::OnPortalDetectionCompleted( 331 void NetworkPortalDetectorImpl::OnPortalDetectionCompleted(
362 const CaptivePortalDetector::Results& results) { 332 const CaptivePortalDetector::Results& results) {
363 DCHECK(CalledOnValidThread()); 333 DCHECK(CalledOnValidThread());
364 DCHECK(IsCheckingForPortal()); 334 DCHECK(IsCheckingForPortal());
365 335
366 VLOG(1) << "Portal detection completed: " 336 VLOG(1) << "Portal detection completed: "
367 << "network=" << active_network_id_ << ", " 337 << "network=" << default_network_id_ << ", "
368 << "result=" << CaptivePortalDetector::CaptivePortalResultToString( 338 << "result=" << CaptivePortalDetector::CaptivePortalResultToString(
369 results.result) << ", " 339 results.result) << ", "
370 << "response_code=" << results.response_code; 340 << "response_code=" << results.response_code;
371 341
372 state_ = STATE_IDLE; 342 state_ = STATE_IDLE;
373 detection_timeout_.Cancel(); 343 detection_timeout_.Cancel();
374 344
375 NetworkLibrary* cros = GetNetworkLibrary(); 345 const NetworkState* default_network =
376 const Network* active_network = cros->active_network(); 346 NetworkStateHandler::Get()->DefaultNetwork();
377 347
378 CaptivePortalState state; 348 CaptivePortalState state;
379 state.response_code = results.response_code; 349 state.response_code = results.response_code;
380 switch (results.result) { 350 switch (results.result) {
381 case captive_portal::RESULT_NO_RESPONSE: 351 case captive_portal::RESULT_NO_RESPONSE:
382 if (attempt_count_ >= kMaxRequestAttempts) { 352 if (attempt_count_ >= kMaxRequestAttempts) {
383 if (state.response_code == net::HTTP_PROXY_AUTHENTICATION_REQUIRED) { 353 if (state.response_code == net::HTTP_PROXY_AUTHENTICATION_REQUIRED) {
384 state.status = CAPTIVE_PORTAL_STATUS_PROXY_AUTH_REQUIRED; 354 state.status = CAPTIVE_PORTAL_STATUS_PROXY_AUTH_REQUIRED;
385 } else if (active_network && active_network->restricted_pool()) { 355 } else if (default_network && (default_network->connection_state() ==
356 flimflam::kStatePortal)) {
386 // Take into account shill's detection results. 357 // Take into account shill's detection results.
387 state.status = CAPTIVE_PORTAL_STATUS_PORTAL; 358 state.status = CAPTIVE_PORTAL_STATUS_PORTAL;
388 LOG(WARNING) << "Network " << active_network->unique_id() << " " 359 LOG(WARNING) << "Network " << default_network->guid() << " "
389 << "is marked as " 360 << "is marked as "
390 << CaptivePortalStatusString(state.status) << " " 361 << CaptivePortalStatusString(state.status) << " "
391 << "despite the fact that CaptivePortalDetector " 362 << "despite the fact that CaptivePortalDetector "
392 << "received no response"; 363 << "received no response";
393 } else { 364 } else {
394 state.status = CAPTIVE_PORTAL_STATUS_OFFLINE; 365 state.status = CAPTIVE_PORTAL_STATUS_OFFLINE;
395 } 366 }
396 SetCaptivePortalState(active_network, state); 367 SetCaptivePortalState(default_network, state);
397 } else { 368 } else {
398 DetectCaptivePortal(results.retry_after_delta); 369 DetectCaptivePortal(results.retry_after_delta);
399 } 370 }
400 break; 371 break;
401 case captive_portal::RESULT_INTERNET_CONNECTED: 372 case captive_portal::RESULT_INTERNET_CONNECTED:
402 state.status = CAPTIVE_PORTAL_STATUS_ONLINE; 373 state.status = CAPTIVE_PORTAL_STATUS_ONLINE;
403 SetCaptivePortalState(active_network, state); 374 SetCaptivePortalState(default_network, state);
404 break; 375 break;
405 case captive_portal::RESULT_BEHIND_CAPTIVE_PORTAL: 376 case captive_portal::RESULT_BEHIND_CAPTIVE_PORTAL:
406 state.status = CAPTIVE_PORTAL_STATUS_PORTAL; 377 state.status = CAPTIVE_PORTAL_STATUS_PORTAL;
407 SetCaptivePortalState(active_network, state); 378 SetCaptivePortalState(default_network, state);
408 break; 379 break;
409 default: 380 default:
410 break; 381 break;
411 } 382 }
412 383
413 TryLazyDetection(); 384 TryLazyDetection();
414 } 385 }
415 386
416 void NetworkPortalDetectorImpl::TryLazyDetection() { 387 void NetworkPortalDetectorImpl::TryLazyDetection() {
417 if (!IsPortalCheckPending() && !IsCheckingForPortal() && 388 if (!IsPortalCheckPending() && !IsCheckingForPortal() &&
(...skipping 20 matching lines...) Expand all
438 409
439 bool NetworkPortalDetectorImpl::IsPortalCheckPending() const { 410 bool NetworkPortalDetectorImpl::IsPortalCheckPending() const {
440 return state_ == STATE_PORTAL_CHECK_PENDING; 411 return state_ == STATE_PORTAL_CHECK_PENDING;
441 } 412 }
442 413
443 bool NetworkPortalDetectorImpl::IsCheckingForPortal() const { 414 bool NetworkPortalDetectorImpl::IsCheckingForPortal() const {
444 return state_ == STATE_CHECKING_FOR_PORTAL; 415 return state_ == STATE_CHECKING_FOR_PORTAL;
445 } 416 }
446 417
447 void NetworkPortalDetectorImpl::SetCaptivePortalState( 418 void NetworkPortalDetectorImpl::SetCaptivePortalState(
448 const Network* network, 419 const NetworkState* network,
449 const CaptivePortalState& state) { 420 const CaptivePortalState& state) {
450 if (!detection_start_time_.is_null()) { 421 if (!detection_start_time_.is_null()) {
451 UMA_HISTOGRAM_TIMES("CaptivePortal.OOBE.DetectionDuration", 422 UMA_HISTOGRAM_TIMES("CaptivePortal.OOBE.DetectionDuration",
452 GetCurrentTimeTicks() - detection_start_time_); 423 GetCurrentTimeTicks() - detection_start_time_);
453 } 424 }
454 425
455 if (!network) { 426 if (!network) {
456 NotifyPortalDetectionCompleted(network, state); 427 NotifyPortalDetectionCompleted(network, state);
457 return; 428 return;
458 } 429 }
459 430
460 CaptivePortalStateMap::const_iterator it = 431 CaptivePortalStateMap::const_iterator it =
461 portal_state_map_.find(network->service_path()); 432 portal_state_map_.find(network->path());
462 if (it == portal_state_map_.end() || 433 if (it == portal_state_map_.end() ||
463 it->second.status != state.status || 434 it->second.status != state.status ||
464 it->second.response_code != state.response_code) { 435 it->second.response_code != state.response_code) {
465 VLOG(1) << "Updating Chrome Captive Portal state: " 436 VLOG(1) << "Updating Chrome Captive Portal state: "
466 << "network=" << network->unique_id() << ", " 437 << "network=" << network->guid() << ", "
467 << "status=" << CaptivePortalStatusString(state.status) << ", " 438 << "status=" << CaptivePortalStatusString(state.status) << ", "
468 << "response_code=" << state.response_code; 439 << "response_code=" << state.response_code;
469 portal_state_map_[network->service_path()] = state; 440 portal_state_map_[network->path()] = state;
470 } 441 }
471 NotifyPortalDetectionCompleted(network, state); 442 NotifyPortalDetectionCompleted(network, state);
472 } 443 }
473 444
474 void NetworkPortalDetectorImpl::NotifyPortalDetectionCompleted( 445 void NetworkPortalDetectorImpl::NotifyPortalDetectionCompleted(
475 const Network* network, 446 const NetworkState* network,
476 const CaptivePortalState& state) { 447 const CaptivePortalState& state) {
477 FOR_EACH_OBSERVER(Observer, observers_, 448 FOR_EACH_OBSERVER(Observer, observers_,
478 OnPortalDetectionCompleted(network, state)); 449 OnPortalDetectionCompleted(network, state));
479 } 450 }
480 451
481 base::TimeTicks NetworkPortalDetectorImpl::GetCurrentTimeTicks() const { 452 base::TimeTicks NetworkPortalDetectorImpl::GetCurrentTimeTicks() const {
482 if (time_ticks_for_testing_.is_null()) 453 if (time_ticks_for_testing_.is_null())
483 return base::TimeTicks::Now(); 454 return base::TimeTicks::Now();
484 else 455 else
485 return time_ticks_for_testing_; 456 return time_ticks_for_testing_;
486 } 457 }
487 458
488 bool NetworkPortalDetectorImpl::DetectionTimeoutIsCancelledForTesting() const { 459 bool NetworkPortalDetectorImpl::DetectionTimeoutIsCancelledForTesting() const {
489 return detection_timeout_.IsCancelled(); 460 return detection_timeout_.IsCancelled();
490 } 461 }
491 462
492 } // namespace chromeos 463 } // namespace chromeos
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698