Home | History | Annotate | Download | only in chromeos
      1 // Copyright (c) 2012 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 #ifndef CHROME_BROWSER_CHROMEOS_PROXY_CONFIG_SERVICE_IMPL_H_
      6 #define CHROME_BROWSER_CHROMEOS_PROXY_CONFIG_SERVICE_IMPL_H_
      7 
      8 #include <string>
      9 
     10 #include "base/basictypes.h"
     11 #include "base/compiler_specific.h"
     12 #include "base/prefs/pref_change_registrar.h"
     13 #include "chrome/browser/net/pref_proxy_config_tracker_impl.h"
     14 #include "chromeos/network/network_state_handler_observer.h"
     15 #include "components/onc/onc_constants.h"
     16 
     17 namespace chromeos {
     18 
     19 class NetworkState;
     20 
     21 // Implementation of proxy config service for chromeos that:
     22 // - extends PrefProxyConfigTrackerImpl (and so lives and runs entirely on UI
     23 //   thread) to handle proxy from prefs (via PrefProxyConfigTrackerImpl) and
     24 //   system i.e. network (via shill notifications)
     25 // - exists one per profile and one per local state
     26 // - persists proxy setting per network in flimflim
     27 // - provides network stack with latest effective proxy configuration for
     28 //   currently active network via PrefProxyConfigTrackerImpl's mechanism of
     29 //   pushing config to ChromeProxyConfigService
     30 class ProxyConfigServiceImpl : public PrefProxyConfigTrackerImpl,
     31                                public NetworkStateHandlerObserver {
     32  public:
     33   // ProxyConfigServiceImpl is created in ProxyServiceFactory::
     34   // CreatePrefProxyConfigTrackerImpl via Profile::GetProxyConfigTracker() for
     35   // profile or via IOThread constructor for local state and is owned by the
     36   // respective classes.
     37   //
     38   // The user's proxy config, proxy policies and proxy from prefs, are used to
     39   // determine the effective proxy config, which is then pushed through
     40   // PrefProxyConfigTrackerImpl to ChromeProxyConfigService to the
     41   // network stack.
     42   //
     43   // |profile_prefs| can be NULL if this object should only track prefs from
     44   // local state (e.g., for system request context or sigin-in screen).
     45   explicit ProxyConfigServiceImpl(PrefService* profile_prefs,
     46                                   PrefService* local_state_prefs);
     47   virtual ~ProxyConfigServiceImpl();
     48 
     49   // PrefProxyConfigTrackerImpl implementation.
     50   virtual void OnProxyConfigChanged(ProxyPrefs::ConfigState config_state,
     51                                     const net::ProxyConfig& config) OVERRIDE;
     52 
     53   // NetworkStateHandlerObserver implementation.
     54   virtual void DefaultNetworkChanged(const NetworkState* network) OVERRIDE;
     55 
     56  protected:
     57   friend class UIProxyConfigService;
     58 
     59   // Returns true if proxy is to be ignored for this network profile and
     60   // |onc_source|, e.g. this happens if the network is shared and
     61   // use-shared-proxies is turned off. |profile_prefs| may be NULL.
     62   static bool IgnoreProxy(const PrefService* profile_prefs,
     63                           const std::string network_profile_path,
     64                           onc::ONCSource onc_source);
     65 
     66  private:
     67   // Called when any proxy preference changes.
     68   void OnProxyPrefChanged();
     69 
     70   // Determines effective proxy config based on prefs from config tracker, the
     71   // current default network and if user is using shared proxies.  The effective
     72   // config is stored in |active_config_| and activated on network stack, and
     73   // hence, picked up by observers.
     74   void DetermineEffectiveConfigFromDefaultNetwork();
     75 
     76   // State of |active_config_|.  |active_config_| is only valid if
     77   // |active_config_state_| is not ProxyPrefs::CONFIG_UNSET.
     78   ProxyPrefs::ConfigState active_config_state_;
     79 
     80   // Active proxy configuration, which could be from prefs or network.
     81   net::ProxyConfig active_config_;
     82 
     83   // Track changes in profile preferences: UseSharedProxies and
     84   // OpenNetworkConfiguration.
     85   PrefChangeRegistrar profile_pref_registrar_;
     86 
     87   // Track changes in local state preferences: DeviceOpenNetworkConfiguration.
     88   PrefChangeRegistrar local_state_pref_registrar_;
     89 
     90   // Not owned. NULL if tracking only local state prefs (e.g. in the system
     91   // request context or sign-in screen).
     92   PrefService* profile_prefs_;
     93 
     94   // Not owned.
     95   PrefService* local_state_prefs_;
     96 
     97   base::WeakPtrFactory<ProxyConfigServiceImpl> pointer_factory_;
     98 
     99   DISALLOW_COPY_AND_ASSIGN(ProxyConfigServiceImpl);
    100 };
    101 
    102 }  // namespace chromeos
    103 
    104 #endif  // CHROME_BROWSER_CHROMEOS_PROXY_CONFIG_SERVICE_IMPL_H_
    105