| OLD | NEW |
| 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/message_loop.h" | 10 #include "base/message_loop/message_loop.h" |
| (...skipping 21 matching lines...) Expand all Loading... |
| 32 // Minimum timeout between consecutive portal checks for the same | 32 // Minimum timeout between consecutive portal checks for the same |
| 33 // network. | 33 // network. |
| 34 const int kMinTimeBetweenAttemptsSec = 3; | 34 const int kMinTimeBetweenAttemptsSec = 3; |
| 35 | 35 |
| 36 // Delay before portal detection caused by changes in proxy settings. | 36 // Delay before portal detection caused by changes in proxy settings. |
| 37 const int kProxyChangeDelaySec = 1; | 37 const int kProxyChangeDelaySec = 1; |
| 38 | 38 |
| 39 // Delay between consecutive portal checks for a network in lazy mode. | 39 // Delay between consecutive portal checks for a network in lazy mode. |
| 40 const int kLazyCheckIntervalSec = 5; | 40 const int kLazyCheckIntervalSec = 5; |
| 41 | 41 |
| 42 const char kCaptivePortalStatusUnknown[] = "Unknown"; | 42 void RecordDiscrepancyWithShill( |
| 43 const char kCaptivePortalStatusOffline[] = "Offline"; | 43 const NetworkState* network, |
| 44 const char kCaptivePortalStatusOnline[] = "Online"; | 44 const NetworkPortalDetector::CaptivePortalStatus status) { |
| 45 const char kCaptivePortalStatusPortal[] = "Portal"; | 45 if (network->connection_state() == shill::kStateOnline) { |
| 46 const char kCaptivePortalStatusProxyAuthRequired[] = | 46 UMA_HISTOGRAM_ENUMERATION( |
| 47 "Proxy authentication required"; | 47 NetworkPortalDetectorImpl::kShillOnlineHistogram, |
| 48 const char kCaptivePortalStatusUnrecognized[] = "Unrecognized"; | 48 status, |
| 49 | 49 NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_COUNT); |
| 50 std::string CaptivePortalStatusString( | 50 } else if (network->connection_state() == shill::kStatePortal) { |
| 51 NetworkPortalDetectorImpl::CaptivePortalStatus status) { | 51 UMA_HISTOGRAM_ENUMERATION( |
| 52 switch (status) { | 52 NetworkPortalDetectorImpl::kShillPortalHistogram, |
| 53 case NetworkPortalDetectorImpl::CAPTIVE_PORTAL_STATUS_UNKNOWN: | 53 status, |
| 54 return kCaptivePortalStatusUnknown; | 54 NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_COUNT); |
| 55 case NetworkPortalDetectorImpl::CAPTIVE_PORTAL_STATUS_OFFLINE: | 55 } else if (network->connection_state() == shill::kStateOffline) { |
| 56 return kCaptivePortalStatusOffline; | 56 UMA_HISTOGRAM_ENUMERATION( |
| 57 case NetworkPortalDetectorImpl::CAPTIVE_PORTAL_STATUS_ONLINE: | 57 NetworkPortalDetectorImpl::kShillOfflineHistogram, |
| 58 return kCaptivePortalStatusOnline; | 58 status, |
| 59 case NetworkPortalDetectorImpl::CAPTIVE_PORTAL_STATUS_PORTAL: | 59 NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_COUNT); |
| 60 return kCaptivePortalStatusPortal; | |
| 61 case NetworkPortalDetectorImpl::CAPTIVE_PORTAL_STATUS_PROXY_AUTH_REQUIRED: | |
| 62 return kCaptivePortalStatusProxyAuthRequired; | |
| 63 case NetworkPortalDetectorImpl::CAPTIVE_PORTAL_STATUS_COUNT: | |
| 64 NOTREACHED(); | |
| 65 } | 60 } |
| 66 return kCaptivePortalStatusUnrecognized; | |
| 67 } | 61 } |
| 68 | 62 |
| 69 } // namespace | 63 } // namespace |
| 70 | 64 |
| 71 //////////////////////////////////////////////////////////////////////////////// | 65 //////////////////////////////////////////////////////////////////////////////// |
| 72 // NetworkPortalDetectorImpl, public: | 66 // NetworkPortalDetectorImpl, public: |
| 73 | 67 |
| 68 const char NetworkPortalDetectorImpl::kDetectionResultHistogram[] = |
| 69 "CaptivePortal.OOBE.DetectionResult"; |
| 70 const char NetworkPortalDetectorImpl::kDetectionDurationHistogram[] = |
| 71 "CaptivePortal.OOBE.DetectionDuration"; |
| 72 const char NetworkPortalDetectorImpl::kShillOnlineHistogram[] = |
| 73 "CaptivePortal.OOBE.DiscrepancyWithShill_Online"; |
| 74 const char NetworkPortalDetectorImpl::kShillPortalHistogram[] = |
| 75 "CaptivePortal.OOBE.DiscrepancyWithShill_RestrictedPool"; |
| 76 const char NetworkPortalDetectorImpl::kShillOfflineHistogram[] = |
| 77 "CaptivePortal.OOBE.DiscrepancyWithShill_Offline"; |
| 78 |
| 74 NetworkPortalDetectorImpl::NetworkPortalDetectorImpl( | 79 NetworkPortalDetectorImpl::NetworkPortalDetectorImpl( |
| 75 const scoped_refptr<net::URLRequestContextGetter>& request_context) | 80 const scoped_refptr<net::URLRequestContextGetter>& request_context) |
| 76 : state_(STATE_IDLE), | 81 : state_(STATE_IDLE), |
| 77 test_url_(CaptivePortalDetector::kDefaultURL), | 82 test_url_(CaptivePortalDetector::kDefaultURL), |
| 78 enabled_(false), | 83 enabled_(false), |
| 79 weak_ptr_factory_(this), | 84 weak_ptr_factory_(this), |
| 80 attempt_count_(0), | 85 attempt_count_(0), |
| 81 lazy_detection_enabled_(false), | 86 lazy_detection_enabled_(false), |
| 82 lazy_check_interval_(base::TimeDelta::FromSeconds(kLazyCheckIntervalSec)), | 87 lazy_check_interval_(base::TimeDelta::FromSeconds(kLazyCheckIntervalSec)), |
| 83 min_time_between_attempts_( | 88 min_time_between_attempts_( |
| (...skipping 361 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 445 return state_ == STATE_PORTAL_CHECK_PENDING; | 450 return state_ == STATE_PORTAL_CHECK_PENDING; |
| 446 } | 451 } |
| 447 | 452 |
| 448 bool NetworkPortalDetectorImpl::IsCheckingForPortal() const { | 453 bool NetworkPortalDetectorImpl::IsCheckingForPortal() const { |
| 449 return state_ == STATE_CHECKING_FOR_PORTAL; | 454 return state_ == STATE_CHECKING_FOR_PORTAL; |
| 450 } | 455 } |
| 451 | 456 |
| 452 void NetworkPortalDetectorImpl::SetCaptivePortalState( | 457 void NetworkPortalDetectorImpl::SetCaptivePortalState( |
| 453 const NetworkState* network, | 458 const NetworkState* network, |
| 454 const CaptivePortalState& state) { | 459 const CaptivePortalState& state) { |
| 455 if (!detection_start_time_.is_null()) { | |
| 456 UMA_HISTOGRAM_TIMES("CaptivePortal.OOBE.DetectionDuration", | |
| 457 GetCurrentTimeTicks() - detection_start_time_); | |
| 458 } | |
| 459 | |
| 460 if (!network) { | 460 if (!network) { |
| 461 NotifyPortalDetectionCompleted(network, state); | 461 NotifyPortalDetectionCompleted(network, state); |
| 462 return; | 462 return; |
| 463 } | 463 } |
| 464 | 464 |
| 465 CaptivePortalStateMap::const_iterator it = | 465 CaptivePortalStateMap::const_iterator it = |
| 466 portal_state_map_.find(network->path()); | 466 portal_state_map_.find(network->path()); |
| 467 if (it == portal_state_map_.end() || | 467 if (it == portal_state_map_.end() || |
| 468 it->second.status != state.status || | 468 it->second.status != state.status || |
| 469 it->second.response_code != state.response_code) { | 469 it->second.response_code != state.response_code) { |
| 470 VLOG(1) << "Updating Chrome Captive Portal state: " | 470 VLOG(1) << "Updating Chrome Captive Portal state: " |
| 471 << "name=" << network->name() << ", " | 471 << "name=" << network->name() << ", " |
| 472 << "id=" << network->guid() << ", " | 472 << "id=" << network->guid() << ", " |
| 473 << "status=" << CaptivePortalStatusString(state.status) << ", " | 473 << "status=" << CaptivePortalStatusString(state.status) << ", " |
| 474 << "response_code=" << state.response_code; | 474 << "response_code=" << state.response_code; |
| 475 |
| 476 // Record detection duration iff detection result differs from the |
| 477 // previous one for this network. The reason is to record all stats |
| 478 // only when network changes it's state. |
| 479 RecordDetectionStats(network, state.status); |
| 480 |
| 475 portal_state_map_[network->path()] = state; | 481 portal_state_map_[network->path()] = state; |
| 476 } | 482 } |
| 477 NotifyPortalDetectionCompleted(network, state); | 483 NotifyPortalDetectionCompleted(network, state); |
| 478 } | 484 } |
| 479 | 485 |
| 480 void NetworkPortalDetectorImpl::NotifyPortalDetectionCompleted( | 486 void NetworkPortalDetectorImpl::NotifyPortalDetectionCompleted( |
| 481 const NetworkState* network, | 487 const NetworkState* network, |
| 482 const CaptivePortalState& state) { | 488 const CaptivePortalState& state) { |
| 483 FOR_EACH_OBSERVER(Observer, observers_, | 489 FOR_EACH_OBSERVER(Observer, observers_, |
| 484 OnPortalDetectionCompleted(network, state)); | 490 OnPortalDetectionCompleted(network, state)); |
| (...skipping 13 matching lines...) Expand all Loading... |
| 498 DCHECK_LE(0, attempt_count_); | 504 DCHECK_LE(0, attempt_count_); |
| 499 const NetworkState* network = | 505 const NetworkState* network = |
| 500 NetworkHandler::Get()->network_state_handler()->DefaultNetwork(); | 506 NetworkHandler::Get()->network_state_handler()->DefaultNetwork(); |
| 501 if (!network) | 507 if (!network) |
| 502 return kBaseRequestTimeoutSec; | 508 return kBaseRequestTimeoutSec; |
| 503 if (lazy_detection_enabled_) | 509 if (lazy_detection_enabled_) |
| 504 return kLazyRequestTimeoutSec; | 510 return kLazyRequestTimeoutSec; |
| 505 return attempt_count_ * kBaseRequestTimeoutSec; | 511 return attempt_count_ * kBaseRequestTimeoutSec; |
| 506 } | 512 } |
| 507 | 513 |
| 514 void NetworkPortalDetectorImpl::RecordDetectionStats( |
| 515 const NetworkState* network, |
| 516 CaptivePortalStatus status) { |
| 517 // Don't record stats for offline state. |
| 518 if (!network) |
| 519 return; |
| 520 |
| 521 if (!detection_start_time_.is_null()) { |
| 522 UMA_HISTOGRAM_MEDIUM_TIMES(kDetectionDurationHistogram, |
| 523 GetCurrentTimeTicks() - detection_start_time_); |
| 524 } |
| 525 UMA_HISTOGRAM_ENUMERATION(kDetectionResultHistogram, |
| 526 status, |
| 527 NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_COUNT); |
| 528 switch (status) { |
| 529 case NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_UNKNOWN: |
| 530 NOTREACHED(); |
| 531 break; |
| 532 case NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_OFFLINE: |
| 533 if (network->connection_state() == shill::kStateOnline || |
| 534 network->connection_state() == shill::kStatePortal) { |
| 535 RecordDiscrepancyWithShill(network, status); |
| 536 } |
| 537 break; |
| 538 case NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE: |
| 539 if (network->connection_state() != shill::kStateOnline) |
| 540 RecordDiscrepancyWithShill(network, status); |
| 541 break; |
| 542 case NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_PORTAL: |
| 543 if (network->connection_state() != shill::kStatePortal) |
| 544 RecordDiscrepancyWithShill(network, status); |
| 545 break; |
| 546 case NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_PROXY_AUTH_REQUIRED: |
| 547 if (network->connection_state() != shill::kStateOnline) |
| 548 RecordDiscrepancyWithShill(network, status); |
| 549 break; |
| 550 case NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_COUNT: |
| 551 NOTREACHED(); |
| 552 break; |
| 553 } |
| 554 } |
| 555 |
| 508 } // namespace chromeos | 556 } // namespace chromeos |
| OLD | NEW |