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

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

Issue 865813005: Fix network portal detector crash on shutdown (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 11 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
« no previous file with comments | « no previous file | chrome/browser/extensions/api/networking_private/networking_private_chromeos.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 <algorithm> 7 #include <algorithm>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/command_line.h" 10 #include "base/command_line.h"
11 #include "base/logging.h" 11 #include "base/logging.h"
12 #include "base/message_loop/message_loop.h" 12 #include "base/message_loop/message_loop.h"
13 #include "base/metrics/histogram.h" 13 #include "base/metrics/histogram.h"
14 #include "base/strings/stringprintf.h" 14 #include "base/strings/stringprintf.h"
15 #include "chrome/browser/chrome_notification_types.h" 15 #include "chrome/browser/chrome_notification_types.h"
16 #include "chromeos/dbus/dbus_thread_manager.h" 16 #include "chromeos/dbus/dbus_thread_manager.h"
17 #include "chromeos/dbus/shill_profile_client.h" 17 #include "chromeos/dbus/shill_profile_client.h"
18 #include "chromeos/device_event_log.h"
18 #include "chromeos/login/login_state.h" 19 #include "chromeos/login/login_state.h"
19 #include "chromeos/network/network_event_log.h"
20 #include "chromeos/network/network_state.h" 20 #include "chromeos/network/network_state.h"
21 #include "chromeos/network/network_state_handler.h" 21 #include "chromeos/network/network_state_handler.h"
22 #include "content/public/browser/notification_service.h" 22 #include "content/public/browser/notification_service.h"
23 #include "content/public/common/content_switches.h" 23 #include "content/public/common/content_switches.h"
24 #include "net/http/http_status_code.h" 24 #include "net/http/http_status_code.h"
25 #include "third_party/cros_system_api/dbus/service_constants.h" 25 #include "third_party/cros_system_api/dbus/service_constants.h"
26 26
27 using base::StringPrintf; 27 using base::StringPrintf;
28 using captive_portal::CaptivePortalDetector; 28 using captive_portal::CaptivePortalDetector;
29 29
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after
155 captive_portal::CaptivePortalResult result, 155 captive_portal::CaptivePortalResult result,
156 int response_code) 156 int response_code)
157 : network_name(network_name), 157 : network_name(network_name),
158 network_id(network_id), 158 network_id(network_id),
159 result(result), 159 result(result),
160 response_code(response_code) { 160 response_code(response_code) {
161 } 161 }
162 162
163 void NetworkPortalDetectorImpl::DetectionAttemptCompletedReport::Report() 163 void NetworkPortalDetectorImpl::DetectionAttemptCompletedReport::Report()
164 const { 164 const {
165 // TODO (ygorshenin@): remove VLOG as soon as NET_LOG_EVENT will be dumped on 165 // To see NET_LOG output, use '--vmodule=device_event_log*=1'
166 // a disk, crbug.com/293739. 166 NET_LOG(EVENT) << "Detection attempt completed: "
167 VLOG(1) << "Detection attempt completed: " 167 << "name=" << network_name << ", "
168 << "name=" << network_name << ", " 168 << "id=" << network_id << ", "
169 << "id=" << network_id << ", " 169 << "result="
170 << "result=" << captive_portal::CaptivePortalResultToString(result) 170 << captive_portal::CaptivePortalResultToString(result) << ", "
171 << ", " 171 << "response_code=" << response_code;
172 << "response_code=" << response_code;
173 NET_LOG_EVENT(StringPrintf(
174 "Portal detection completed: network_id=%s, result=%s, "
175 "response_code=%d",
176 network_id.c_str(),
177 captive_portal::CaptivePortalResultToString(result).c_str(),
178 response_code),
179 network_name);
180 } 172 }
181 173
182 bool NetworkPortalDetectorImpl::DetectionAttemptCompletedReport::Equals( 174 bool NetworkPortalDetectorImpl::DetectionAttemptCompletedReport::Equals(
183 const DetectionAttemptCompletedReport& o) const { 175 const DetectionAttemptCompletedReport& o) const {
184 return network_name == o.network_name && network_id == o.network_id && 176 return network_name == o.network_name && network_id == o.network_id &&
185 result == o.result && response_code == o.response_code; 177 result == o.result && response_code == o.response_code;
186 } 178 }
187 179
188 //////////////////////////////////////////////////////////////////////////////// 180 ////////////////////////////////////////////////////////////////////////////////
189 // NetworkPortalDetectorImpl, public: 181 // NetworkPortalDetectorImpl, public:
(...skipping 24 matching lines...) Expand all
214 const char NetworkPortalDetectorImpl::kSessionPortalToOnlineHistogram[] = 206 const char NetworkPortalDetectorImpl::kSessionPortalToOnlineHistogram[] =
215 "CaptivePortal.Session.PortalToOnlineTransition"; 207 "CaptivePortal.Session.PortalToOnlineTransition";
216 208
217 // static 209 // static
218 void NetworkPortalDetectorImpl::Initialize( 210 void NetworkPortalDetectorImpl::Initialize(
219 net::URLRequestContextGetter* url_context) { 211 net::URLRequestContextGetter* url_context) {
220 if (NetworkPortalDetector::set_for_testing()) 212 if (NetworkPortalDetector::set_for_testing())
221 return; 213 return;
222 CHECK(!NetworkPortalDetector::network_portal_detector()) 214 CHECK(!NetworkPortalDetector::network_portal_detector())
223 << "NetworkPortalDetector was initialized twice."; 215 << "NetworkPortalDetector was initialized twice.";
216 NET_LOG(EVENT) << "NetworkPortalDetectorImpl::Initialize()";
224 if (base::CommandLine::ForCurrentProcess()->HasSwitch(::switches::kTestType)) 217 if (base::CommandLine::ForCurrentProcess()->HasSwitch(::switches::kTestType))
225 set_network_portal_detector(new NetworkPortalDetectorStubImpl()); 218 set_network_portal_detector(new NetworkPortalDetectorStubImpl());
226 else 219 else
227 set_network_portal_detector(new NetworkPortalDetectorImpl(url_context)); 220 set_network_portal_detector(new NetworkPortalDetectorImpl(url_context));
228 } 221 }
229 222
230 NetworkPortalDetectorImpl::NetworkPortalDetectorImpl( 223 NetworkPortalDetectorImpl::NetworkPortalDetectorImpl(
231 const scoped_refptr<net::URLRequestContextGetter>& request_context) 224 const scoped_refptr<net::URLRequestContextGetter>& request_context)
232 : state_(STATE_IDLE), 225 : state_(STATE_IDLE),
233 test_url_(CaptivePortalDetector::kDefaultURL), 226 test_url_(CaptivePortalDetector::kDefaultURL),
234 enabled_(false), 227 enabled_(false),
235 strategy_(PortalDetectorStrategy::CreateById( 228 strategy_(PortalDetectorStrategy::CreateById(
236 PortalDetectorStrategy::STRATEGY_ID_LOGIN_SCREEN, this)), 229 PortalDetectorStrategy::STRATEGY_ID_LOGIN_SCREEN, this)),
237 last_detection_result_(CAPTIVE_PORTAL_STATUS_UNKNOWN), 230 last_detection_result_(CAPTIVE_PORTAL_STATUS_UNKNOWN),
238 same_detection_result_count_(0), 231 same_detection_result_count_(0),
239 no_response_result_count_(0), 232 no_response_result_count_(0),
240 weak_factory_(this) { 233 weak_factory_(this) {
234 NET_LOG(EVENT) << "NetworkPortalDetectorImpl::NetworkPortalDetectorImpl()";
241 captive_portal_detector_.reset(new CaptivePortalDetector(request_context)); 235 captive_portal_detector_.reset(new CaptivePortalDetector(request_context));
242 236
243 registrar_.Add(this, 237 registrar_.Add(this,
244 chrome::NOTIFICATION_LOGIN_PROXY_CHANGED, 238 chrome::NOTIFICATION_LOGIN_PROXY_CHANGED,
245 content::NotificationService::AllSources()); 239 content::NotificationService::AllSources());
246 registrar_.Add(this, 240 registrar_.Add(this,
247 chrome::NOTIFICATION_AUTH_SUPPLIED, 241 chrome::NOTIFICATION_AUTH_SUPPLIED,
248 content::NotificationService::AllSources()); 242 content::NotificationService::AllSources());
249 registrar_.Add(this, 243 registrar_.Add(this,
250 chrome::NOTIFICATION_AUTH_CANCELLED, 244 chrome::NOTIFICATION_AUTH_CANCELLED,
251 content::NotificationService::AllSources()); 245 content::NotificationService::AllSources());
252 246
253 NetworkHandler::Get()->network_state_handler()->AddObserver(this, FROM_HERE); 247 NetworkHandler::Get()->network_state_handler()->AddObserver(this, FROM_HERE);
254 StartDetectionIfIdle(); 248 StartDetectionIfIdle();
255 } 249 }
256 250
257 NetworkPortalDetectorImpl::~NetworkPortalDetectorImpl() { 251 NetworkPortalDetectorImpl::~NetworkPortalDetectorImpl() {
252 NET_LOG(EVENT) << "NetworkPortalDetectorImpl::~NetworkPortalDetectorImpl()";
258 DCHECK(CalledOnValidThread()); 253 DCHECK(CalledOnValidThread());
259 254
260 attempt_task_.Cancel(); 255 attempt_task_.Cancel();
261 attempt_timeout_.Cancel(); 256 attempt_timeout_.Cancel();
262 257
263 captive_portal_detector_->Cancel(); 258 captive_portal_detector_->Cancel();
264 captive_portal_detector_.reset(); 259 captive_portal_detector_.reset();
265 observers_.Clear(); 260 observers_.Clear();
266 if (NetworkHandler::IsInitialized()) { 261 if (NetworkHandler::IsInitialized()) {
267 NetworkHandler::Get()->network_state_handler()->RemoveObserver(this, 262 NetworkHandler::Get()->network_state_handler()->RemoveObserver(this,
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
299 DCHECK(CalledOnValidThread()); 294 DCHECK(CalledOnValidThread());
300 if (enabled_) 295 if (enabled_)
301 return; 296 return;
302 297
303 DCHECK(is_idle()); 298 DCHECK(is_idle());
304 enabled_ = true; 299 enabled_ = true;
305 300
306 const NetworkState* network = DefaultNetwork(); 301 const NetworkState* network = DefaultNetwork();
307 if (!start_detection || !network) 302 if (!start_detection || !network)
308 return; 303 return;
309 NET_LOG_EVENT(StringPrintf("Starting detection attempt: network_id=%s", 304 NET_LOG(EVENT) << "Starting detection attempt:"
310 network->guid().c_str()), 305 << " name=" << network->name() << " id=" << network->guid();
311 network->name());
312 portal_state_map_.erase(network->guid()); 306 portal_state_map_.erase(network->guid());
313 StartDetection(); 307 StartDetection();
314 } 308 }
315 309
316 NetworkPortalDetectorImpl::CaptivePortalState 310 NetworkPortalDetectorImpl::CaptivePortalState
317 NetworkPortalDetectorImpl::GetCaptivePortalState(const std::string& guid) { 311 NetworkPortalDetectorImpl::GetCaptivePortalState(const std::string& guid) {
318 DCHECK(CalledOnValidThread()); 312 DCHECK(CalledOnValidThread());
319 CaptivePortalStateMap::const_iterator it = portal_state_map_.find(guid); 313 CaptivePortalStateMap::const_iterator it = portal_state_map_.find(guid);
320 if (it == portal_state_map_.end()) 314 if (it == portal_state_map_.end())
321 return CaptivePortalState(); 315 return CaptivePortalState();
(...skipping 14 matching lines...) Expand all
336 strategy_ = PortalDetectorStrategy::CreateById(id, this).Pass(); 330 strategy_ = PortalDetectorStrategy::CreateById(id, this).Pass();
337 StopDetection(); 331 StopDetection();
338 StartDetectionIfIdle(); 332 StartDetectionIfIdle();
339 } 333 }
340 334
341 void NetworkPortalDetectorImpl::DefaultNetworkChanged( 335 void NetworkPortalDetectorImpl::DefaultNetworkChanged(
342 const NetworkState* default_network) { 336 const NetworkState* default_network) {
343 DCHECK(CalledOnValidThread()); 337 DCHECK(CalledOnValidThread());
344 338
345 if (!default_network) { 339 if (!default_network) {
346 NET_LOG_EVENT("Default network changed", "None"); 340 NET_LOG(EVENT) << "Default network changed: None";
347 341
348 default_network_name_.clear(); 342 default_network_name_.clear();
349 343
350 StopDetection(); 344 StopDetection();
351 345
352 CaptivePortalState state; 346 CaptivePortalState state;
353 state.status = CAPTIVE_PORTAL_STATUS_OFFLINE; 347 state.status = CAPTIVE_PORTAL_STATUS_OFFLINE;
354 OnDetectionCompleted(NULL, state); 348 OnDetectionCompleted(NULL, state);
355 return; 349 return;
356 } 350 }
357 351
358 default_network_name_ = default_network->name(); 352 default_network_name_ = default_network->name();
359 353
360 bool network_changed = (default_network_id_ != default_network->guid()); 354 bool network_changed = (default_network_id_ != default_network->guid());
361 default_network_id_ = default_network->guid(); 355 default_network_id_ = default_network->guid();
362 356
363 bool connection_state_changed = 357 bool connection_state_changed =
364 (default_connection_state_ != default_network->connection_state()); 358 (default_connection_state_ != default_network->connection_state());
365 default_connection_state_ = default_network->connection_state(); 359 default_connection_state_ = default_network->connection_state();
366 360
367 NET_LOG_EVENT(StringPrintf( 361 NET_LOG(EVENT) << "Default network changed:"
368 "Default network changed: network_id=%s, state=%s, " 362 << " name=" << default_network_name_
369 "changed=%d, state_changed=%d", 363 << " id=" << default_network_id_
370 default_network_id_.c_str(), 364 << " state=" << default_connection_state_
371 default_connection_state_.c_str(), 365 << " changed=" << network_changed
372 network_changed, 366 << " state_changed=" << connection_state_changed;
373 connection_state_changed),
374 default_network_name_);
375 367
376 if (network_changed || connection_state_changed) 368 if (network_changed || connection_state_changed)
377 StopDetection(); 369 StopDetection();
378 370
379 if (is_idle() && NetworkState::StateIsConnected(default_connection_state_)) { 371 if (is_idle() && NetworkState::StateIsConnected(default_connection_state_)) {
380 // Initiate Captive Portal detection if network's captive 372 // Initiate Captive Portal detection if network's captive
381 // portal state is unknown (e.g. for freshly created networks), 373 // portal state is unknown (e.g. for freshly created networks),
382 // offline or if network connection state was changed. 374 // offline or if network connection state was changed.
383 CaptivePortalState state = GetCaptivePortalState(default_network->guid()); 375 CaptivePortalState state = GetCaptivePortalState(default_network->guid());
384 if (state.status == CAPTIVE_PORTAL_STATUS_UNKNOWN || 376 if (state.status == CAPTIVE_PORTAL_STATUS_UNKNOWN ||
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
457 base::MessageLoop::current()->PostDelayedTask( 449 base::MessageLoop::current()->PostDelayedTask(
458 FROM_HERE, 450 FROM_HERE,
459 attempt_timeout_.callback(), 451 attempt_timeout_.callback(),
460 strategy_->GetNextAttemptTimeout()); 452 strategy_->GetNextAttemptTimeout());
461 } 453 }
462 454
463 void NetworkPortalDetectorImpl::OnAttemptTimeout() { 455 void NetworkPortalDetectorImpl::OnAttemptTimeout() {
464 DCHECK(CalledOnValidThread()); 456 DCHECK(CalledOnValidThread());
465 DCHECK(is_checking_for_portal()); 457 DCHECK(is_checking_for_portal());
466 458
467 NET_LOG_ERROR(StringPrintf("Portal detection timeout: network_id=%s", 459 NET_LOG(ERROR) << "Portal detection timeout: "
468 default_network_id_.c_str()), 460 << " name=" << default_network_name_
469 default_network_name_); 461 << " id=" << default_network_id_;
470 462
471 captive_portal_detector_->Cancel(); 463 captive_portal_detector_->Cancel();
472 CaptivePortalDetector::Results results; 464 CaptivePortalDetector::Results results;
473 results.result = captive_portal::RESULT_NO_RESPONSE; 465 results.result = captive_portal::RESULT_NO_RESPONSE;
474 OnAttemptCompleted(results); 466 OnAttemptCompleted(results);
475 } 467 }
476 468
477 void NetworkPortalDetectorImpl::OnAttemptCompleted( 469 void NetworkPortalDetectorImpl::OnAttemptCompleted(
478 const CaptivePortalDetector::Results& results) { 470 const CaptivePortalDetector::Results& results) {
479 DCHECK(CalledOnValidThread()); 471 DCHECK(CalledOnValidThread());
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
557 ScheduleAttempt(results.retry_after_delta); 549 ScheduleAttempt(results.retry_after_delta);
558 } 550 }
559 551
560 void NetworkPortalDetectorImpl::Observe( 552 void NetworkPortalDetectorImpl::Observe(
561 int type, 553 int type,
562 const content::NotificationSource& source, 554 const content::NotificationSource& source,
563 const content::NotificationDetails& details) { 555 const content::NotificationDetails& details) {
564 if (type == chrome::NOTIFICATION_LOGIN_PROXY_CHANGED || 556 if (type == chrome::NOTIFICATION_LOGIN_PROXY_CHANGED ||
565 type == chrome::NOTIFICATION_AUTH_SUPPLIED || 557 type == chrome::NOTIFICATION_AUTH_SUPPLIED ||
566 type == chrome::NOTIFICATION_AUTH_CANCELLED) { 558 type == chrome::NOTIFICATION_AUTH_CANCELLED) {
567 NET_LOG_EVENT( 559 NET_LOG(EVENT) << "Restarting portal detection due to proxy change"
568 "Restarting portal detection due to proxy change", 560 << " name=" << default_network_name_;
569 default_network_name_.empty() ? "None" : default_network_name_);
570 StopDetection(); 561 StopDetection();
571 ScheduleAttempt(base::TimeDelta::FromSeconds(kProxyChangeDelaySec)); 562 ScheduleAttempt(base::TimeDelta::FromSeconds(kProxyChangeDelaySec));
572 } 563 }
573 } 564 }
574 565
575 void NetworkPortalDetectorImpl::OnDetectionCompleted( 566 void NetworkPortalDetectorImpl::OnDetectionCompleted(
576 const NetworkState* network, 567 const NetworkState* network,
577 const CaptivePortalState& state) { 568 const CaptivePortalState& state) {
578 if (!network) { 569 if (!network) {
579 NotifyDetectionCompleted(network, state); 570 NotifyDetectionCompleted(network, state);
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
651 } 642 }
652 643
653 void NetworkPortalDetectorImpl::ResetStrategyAndCounters() { 644 void NetworkPortalDetectorImpl::ResetStrategyAndCounters() {
654 last_detection_result_ = CAPTIVE_PORTAL_STATUS_UNKNOWN; 645 last_detection_result_ = CAPTIVE_PORTAL_STATUS_UNKNOWN;
655 same_detection_result_count_ = 0; 646 same_detection_result_count_ = 0;
656 no_response_result_count_ = 0; 647 no_response_result_count_ = 0;
657 strategy_->Reset(); 648 strategy_->Reset();
658 } 649 }
659 650
660 } // namespace chromeos 651 } // namespace chromeos
OLDNEW
« no previous file with comments | « no previous file | chrome/browser/extensions/api/networking_private/networking_private_chromeos.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698