// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef CHROME_BROWSER_CHROMEOS_PROXY_CONFIG_SERVICE_IMPL_H_ #define CHROME_BROWSER_CHROMEOS_PROXY_CONFIG_SERVICE_IMPL_H_ #include <string> #include "base/basictypes.h" #include "base/compiler_specific.h" #include "base/prefs/pref_change_registrar.h" #include "chrome/browser/net/pref_proxy_config_tracker_impl.h" #include "chromeos/network/network_state_handler_observer.h" #include "components/onc/onc_constants.h" namespace chromeos { class NetworkState; // Implementation of proxy config service for chromeos that: // - extends PrefProxyConfigTrackerImpl (and so lives and runs entirely on UI // thread) to handle proxy from prefs (via PrefProxyConfigTrackerImpl) and // system i.e. network (via shill notifications) // - exists one per profile and one per local state // - persists proxy setting per network in flimflim // - provides network stack with latest effective proxy configuration for // currently active network via PrefProxyConfigTrackerImpl's mechanism of // pushing config to ChromeProxyConfigService class ProxyConfigServiceImpl : public PrefProxyConfigTrackerImpl, public NetworkStateHandlerObserver { public: // ProxyConfigServiceImpl is created in ProxyServiceFactory:: // CreatePrefProxyConfigTrackerImpl via Profile::GetProxyConfigTracker() for // profile or via IOThread constructor for local state and is owned by the // respective classes. // // The user's proxy config, proxy policies and proxy from prefs, are used to // determine the effective proxy config, which is then pushed through // PrefProxyConfigTrackerImpl to ChromeProxyConfigService to the // network stack. // // |profile_prefs| can be NULL if this object should only track prefs from // local state (e.g., for system request context or sigin-in screen). explicit ProxyConfigServiceImpl(PrefService* profile_prefs, PrefService* local_state_prefs); virtual ~ProxyConfigServiceImpl(); // PrefProxyConfigTrackerImpl implementation. virtual void OnProxyConfigChanged(ProxyPrefs::ConfigState config_state, const net::ProxyConfig& config) OVERRIDE; // NetworkStateHandlerObserver implementation. virtual void DefaultNetworkChanged(const NetworkState* network) OVERRIDE; protected: friend class UIProxyConfigService; // Returns true if proxy is to be ignored for this network profile and // |onc_source|, e.g. this happens if the network is shared and // use-shared-proxies is turned off. |profile_prefs| may be NULL. static bool IgnoreProxy(const PrefService* profile_prefs, const std::string network_profile_path, onc::ONCSource onc_source); private: // Called when any proxy preference changes. void OnProxyPrefChanged(); // Determines effective proxy config based on prefs from config tracker, the // current default network and if user is using shared proxies. The effective // config is stored in |active_config_| and activated on network stack, and // hence, picked up by observers. void DetermineEffectiveConfigFromDefaultNetwork(); // State of |active_config_|. |active_config_| is only valid if // |active_config_state_| is not ProxyPrefs::CONFIG_UNSET. ProxyPrefs::ConfigState active_config_state_; // Active proxy configuration, which could be from prefs or network. net::ProxyConfig active_config_; // Track changes in profile preferences: UseSharedProxies and // OpenNetworkConfiguration. PrefChangeRegistrar profile_pref_registrar_; // Track changes in local state preferences: DeviceOpenNetworkConfiguration. PrefChangeRegistrar local_state_pref_registrar_; // Not owned. NULL if tracking only local state prefs (e.g. in the system // request context or sign-in screen). PrefService* profile_prefs_; // Not owned. PrefService* local_state_prefs_; base::WeakPtrFactory<ProxyConfigServiceImpl> pointer_factory_; DISALLOW_COPY_AND_ASSIGN(ProxyConfigServiceImpl); }; } // namespace chromeos #endif // CHROME_BROWSER_CHROMEOS_PROXY_CONFIG_SERVICE_IMPL_H_