Home | History | Annotate | Download | only in net
      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
      3 // found in the LICENSE file.
      4 
      5 #include "chrome/browser/chromeos/net/network_portal_detector.h"
      6 
      7 #include "base/command_line.h"
      8 #include "base/logging.h"
      9 #include "chrome/browser/browser_process.h"
     10 #include "chrome/browser/chromeos/net/network_portal_detector_impl.h"
     11 #include "chrome/browser/chromeos/net/network_portal_detector_test_impl.h"
     12 #include "chrome/common/chrome_switches.h"
     13 #include "chromeos/chromeos_switches.h"
     14 
     15 namespace chromeos {
     16 
     17 namespace {
     18 
     19 const char kCaptivePortalStatusUnknown[] = "Unknown";
     20 const char kCaptivePortalStatusOffline[] = "Offline";
     21 const char kCaptivePortalStatusOnline[]  = "Online";
     22 const char kCaptivePortalStatusPortal[]  = "Portal";
     23 const char kCaptivePortalStatusProxyAuthRequired[] = "ProxyAuthRequired";
     24 const char kCaptivePortalStatusUnrecognized[] = "Unrecognized";
     25 
     26 NetworkPortalDetector* g_network_portal_detector = NULL;
     27 bool g_network_portal_detector_set_for_testing = false;
     28 
     29 bool IsTestMode() {
     30   return CommandLine::ForCurrentProcess()->HasSwitch(::switches::kTestType);
     31 }
     32 
     33 // Stub implementation of NetworkPortalDetector.
     34 class NetworkPortalDetectorStubImpl : public NetworkPortalDetector {
     35  protected:
     36   // NetworkPortalDetector implementation:
     37   virtual void AddObserver(Observer* /* observer */) OVERRIDE {}
     38   virtual void AddAndFireObserver(Observer* observer) OVERRIDE {
     39     if (observer)
     40       observer->OnPortalDetectionCompleted(NULL, CaptivePortalState());
     41   }
     42   virtual void RemoveObserver(Observer* /* observer */) OVERRIDE {}
     43   virtual CaptivePortalState GetCaptivePortalState(
     44       const std::string& /* service_path */) OVERRIDE {
     45     return CaptivePortalState();
     46   }
     47   virtual bool IsEnabled() OVERRIDE { return false; }
     48   virtual void Enable(bool /* start_detection */) OVERRIDE {}
     49   virtual bool StartDetectionIfIdle() OVERRIDE { return false; }
     50   virtual void SetStrategy(
     51       PortalDetectorStrategy::StrategyId /* id */) OVERRIDE {}
     52 };
     53 
     54 }  // namespace
     55 
     56 void NetworkPortalDetector::InitializeForTesting(
     57     NetworkPortalDetector* network_portal_detector) {
     58   if (network_portal_detector) {
     59     CHECK(!g_network_portal_detector_set_for_testing)
     60         << "NetworkPortalDetector::InitializeForTesting is called twice";
     61     CHECK(network_portal_detector);
     62     delete g_network_portal_detector;
     63     g_network_portal_detector = network_portal_detector;
     64     g_network_portal_detector_set_for_testing = true;
     65   } else {
     66     g_network_portal_detector = NULL;
     67     g_network_portal_detector_set_for_testing = false;
     68   }
     69 }
     70 
     71 // static
     72 void NetworkPortalDetector::Initialize() {
     73   if (g_network_portal_detector_set_for_testing)
     74     return;
     75   CHECK(!g_network_portal_detector)
     76       << "NetworkPortalDetector::Initialize() is called twice";
     77   if (IsTestMode()) {
     78     g_network_portal_detector = new NetworkPortalDetectorStubImpl();
     79   } else {
     80     CHECK(g_browser_process);
     81     CHECK(g_browser_process->system_request_context());
     82     g_network_portal_detector = new NetworkPortalDetectorImpl(
     83         g_browser_process->system_request_context());
     84   }
     85 }
     86 
     87 // static
     88 void NetworkPortalDetector::Shutdown() {
     89   CHECK(g_network_portal_detector || g_network_portal_detector_set_for_testing)
     90       << "NetworkPortalDetectorImpl::Shutdown() is called "
     91       << "without previous call to Initialize()";
     92   delete g_network_portal_detector;
     93   g_network_portal_detector = NULL;
     94 }
     95 
     96 // static
     97 NetworkPortalDetector* NetworkPortalDetector::Get() {
     98   CHECK(g_network_portal_detector)
     99       << "NetworkPortalDetector::Get() called before Initialize()";
    100   return g_network_portal_detector;
    101 }
    102 
    103 // static
    104 std::string NetworkPortalDetector::CaptivePortalStatusString(
    105     CaptivePortalStatus status) {
    106   switch (status) {
    107     case NetworkPortalDetectorImpl::CAPTIVE_PORTAL_STATUS_UNKNOWN:
    108       return kCaptivePortalStatusUnknown;
    109     case NetworkPortalDetectorImpl::CAPTIVE_PORTAL_STATUS_OFFLINE:
    110       return kCaptivePortalStatusOffline;
    111     case NetworkPortalDetectorImpl::CAPTIVE_PORTAL_STATUS_ONLINE:
    112       return kCaptivePortalStatusOnline;
    113     case NetworkPortalDetectorImpl::CAPTIVE_PORTAL_STATUS_PORTAL:
    114       return kCaptivePortalStatusPortal;
    115     case NetworkPortalDetectorImpl::CAPTIVE_PORTAL_STATUS_PROXY_AUTH_REQUIRED:
    116       return kCaptivePortalStatusProxyAuthRequired;
    117     case NetworkPortalDetectorImpl::CAPTIVE_PORTAL_STATUS_COUNT:
    118       NOTREACHED();
    119   }
    120   return kCaptivePortalStatusUnrecognized;
    121 }
    122 
    123 // static
    124 bool NetworkPortalDetector::IsInitialized() {
    125   return g_network_portal_detector;
    126 }
    127 
    128 }  // namespace chromeos
    129