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

Unified Diff: chrome/browser/chromeos/proxy_config_service_impl.cc

Issue 14846004: Migrate ProxyConfigServiceImpl to NetworkStateHandler and NetworkProfileHandler. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Initial patch. Created 7 years, 7 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 side-by-side diff with in-line comments
Download patch
Index: chrome/browser/chromeos/proxy_config_service_impl.cc
diff --git a/chrome/browser/chromeos/proxy_config_service_impl.cc b/chrome/browser/chromeos/proxy_config_service_impl.cc
index 71ba9761f9244b6cbc7e694ae0223396155520e1..a45caec7859e62b2e8b8075c8bf9d44571277c28 100644
--- a/chrome/browser/chromeos/proxy_config_service_impl.cc
+++ b/chrome/browser/chromeos/proxy_config_service_impl.cc
@@ -7,13 +7,15 @@
#include <ostream>
#include "base/bind.h"
-#include "base/json/json_string_value_serializer.h"
+#include "base/json/json_writer.h"
#include "base/logging.h"
#include "base/prefs/pref_registry_simple.h"
#include "base/prefs/pref_service.h"
#include "base/string_util.h"
+#include "base/values.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/chromeos/cros/cros_library.h"
+#include "chrome/browser/chromeos/cros/network_library.h"
#include "chrome/browser/chromeos/cros/network_property_ui_data.h"
#include "chrome/browser/chromeos/login/user_manager.h"
#include "chrome/browser/chromeos/settings/cros_settings.h"
@@ -26,6 +28,10 @@
#include "chrome/browser/profiles/profile_manager.h"
#include "chrome/common/chrome_notification_types.h"
#include "chrome/common/pref_names.h"
+#include "chromeos/network/network_profile.h"
+#include "chromeos/network/network_profile_handler.h"
+#include "chromeos/network/network_state.h"
+#include "chromeos/network/network_state_handler.h"
#include "chromeos/network/network_ui_data.h"
#include "chromeos/network/onc/onc_constants.h"
#include "components/user_prefs/pref_registry_syncable.h"
@@ -97,12 +103,18 @@ const char* ConfigStateToString(ProxyPrefs::ConfigState state) {
return "";
}
-// Returns true if proxy settings from |network| is editable.
-bool IsNetworkProxySettingsEditable(const Network* network) {
- if (!network)
- return true; // editable if no network given.
-
+// Returns true if proxy settings of |network_state| are editable.
+bool IsNetworkProxySettingsEditable(const NetworkState& network_state) {
NetworkLibrary* network_library = CrosLibrary::Get()->GetNetworkLibrary();
+ Network* network = network_library->FindNetworkByPath(network_state.path());
+
+ if (!network) {
+ LOG(ERROR) << "Could not find network " << network_state.path()
+ << " in NetworkLibrary. Falling back to user-editable proxy"
+ << " settings";
+ return true;
+ }
+
const base::DictionaryValue* onc =
network_library->FindOncForNetwork(network->unique_id());
@@ -239,7 +251,8 @@ bool ProxyConfigServiceImpl::ProxyConfig::FromNetProxyConfig(
return false;
}
-DictionaryValue* ProxyConfigServiceImpl::ProxyConfig::ToPrefProxyConfig() {
+base::DictionaryValue*
+ProxyConfigServiceImpl::ProxyConfig::ToPrefProxyConfig() {
Mattias Nissler (ping if slow) 2013/05/08 12:46:36 nit: indent by 4
pneubeck (no reviews) 2013/05/08 18:32:14 Done.
switch (mode) {
case MODE_DIRECT: {
return ProxyConfigDictionary::CreateDirect();
@@ -353,7 +366,7 @@ bool ProxyConfigServiceImpl::ProxyConfig::SerializeForNetwork(
return false;
// Return empty string for direct mode for portal check to work correctly.
- DictionaryValue *dict = proxy_dict_ptr.get();
+ base::DictionaryValue *dict = proxy_dict_ptr.get();
ProxyConfigDictionary proxy_dict(dict);
ProxyPrefs::ProxyMode mode;
if (proxy_dict.GetMode(&mode)) {
@@ -362,8 +375,8 @@ bool ProxyConfigServiceImpl::ProxyConfig::SerializeForNetwork(
return true;
}
}
- JSONStringValueSerializer serializer(output);
- return serializer.Serialize(*dict);
+ base::JSONWriter::Write(dict, output);
+ return true;
}
//----------- ProxyConfigServiceImpl::ProxyConfig: private methods -------------
@@ -403,43 +416,49 @@ ProxyConfigServiceImpl::ProxyConfigServiceImpl(PrefService* pref_service)
FetchProxyPolicy();
- // Register for shill network notifications.
- NetworkLibrary* network_lib = CrosLibrary::Get()->GetNetworkLibrary();
- OnActiveNetworkChanged(network_lib, network_lib->active_network());
- network_lib->AddNetworkManagerObserver(this);
+ // Register for changes to the default network.
+ NetworkStateHandler* state_handler = NetworkStateHandler::Get();
+ state_handler->AddObserver(this);
+ DefaultNetworkChanged(state_handler->DefaultNetwork());
}
ProxyConfigServiceImpl::~ProxyConfigServiceImpl() {
- NetworkLibrary* netlib = CrosLibrary::Get()->GetNetworkLibrary();
- if (netlib) {
- netlib->RemoveNetworkManagerObserver(this);
- netlib->RemoveObserverForAllNetworks(this);
- }
}
void ProxyConfigServiceImpl::UISetCurrentNetwork(
const std::string& current_network) {
- Network* network = CrosLibrary::Get()->GetNetworkLibrary()->FindNetworkByPath(
- current_network);
+ const NetworkState* network =
+ NetworkStateHandler::Get()->GetNetworkState(current_network);
if (!network) {
ResetUICache();
LOG(ERROR) << "Can't find requested network " << current_network;
return;
}
current_ui_network_ = current_network;
- OnUISetCurrentNetwork(network);
-}
-void ProxyConfigServiceImpl::UIMakeActiveNetworkCurrent() {
- Network* network = CrosLibrary::Get()->GetNetworkLibrary()->FindNetworkByPath(
- active_network_);
- if (!network) {
- ResetUICache();
- LOG(ERROR) << "Can't find requested network " << active_network_;
- return;
+ DetermineEffectiveConfig(network, false);
+ VLOG(1) << "Current ui network: "
+ << network->name()
+ << ", " << ModeToString(current_ui_config_.mode)
+ << ", " << ConfigStateToString(current_ui_config_.state)
+ << ", modifiable:" << current_ui_config_.user_modifiable;
+ // Notify observers.
+ std::vector<base::Closure>::iterator iter = callbacks_.begin();
+ while (iter != callbacks_.end()) {
+ if (iter->is_null()) {
+ iter = callbacks_.erase(iter);
+ } else {
+ iter->Run();
+ ++iter;
+ }
}
- current_ui_network_ = active_network_;
- OnUISetCurrentNetwork(network);
+}
+
+void ProxyConfigServiceImpl::UIMakeDefaultNetworkCurrent() {
+ const NetworkState* default_network =
+ NetworkStateHandler::Get()->DefaultNetwork();
+ UISetCurrentNetwork(
+ default_network ? default_network->path() : std::string());
}
void ProxyConfigServiceImpl::UIGetCurrentNetworkName(
@@ -463,7 +482,7 @@ void ProxyConfigServiceImpl::UIGetCurrentNetworkName(
void ProxyConfigServiceImpl::UIGetProxyConfig(ProxyConfig* config) {
// Simply returns the copy last set from UI via UISetCurrentNetwork or
- // UIMakeActiveNetworkCurrent.
+ // UIMakeDefaultNetworkCurrent.
*config = current_ui_config_;
}
@@ -542,46 +561,16 @@ void ProxyConfigServiceImpl::OnProxyConfigChanged(
const net::ProxyConfig& config) {
VLOG(1) << "Got prefs change: " << ConfigStateToString(config_state)
<< ", mode=" << config.proxy_rules().type;
- Network* network = NULL;
- if (!active_network_.empty()) {
- network = CrosLibrary::Get()->GetNetworkLibrary()->FindNetworkByPath(
- active_network_);
- if (!network)
- LOG(ERROR) << "can't find requested network " << active_network_;
- }
- DetermineEffectiveConfig(network, true);
-}
-
-void ProxyConfigServiceImpl::OnNetworkManagerChanged(
- NetworkLibrary* network_lib) {
- VLOG(1) << "OnNetworkManagerChanged: use-shared-proxies="
- << GetUseSharedProxies();
- OnActiveNetworkChanged(network_lib, network_lib->active_network());
-}
-
-void ProxyConfigServiceImpl::OnNetworkChanged(NetworkLibrary* network_lib,
- const Network* network) {
- if (!network)
- return;
- VLOG(1) << "OnNetworkChanged: "
- << (network->name().empty() ? network->service_path() :
- network->name())
- << ", use-shared-proxies=" << GetUseSharedProxies();
- // We only care about active network.
- if (network == network_lib->active_network())
- OnActiveNetworkChanged(network_lib, network);
+ UpdateProxyConfigOfDefaultNetwork();
}
// static
-bool ProxyConfigServiceImpl::ParseProxyConfig(const Network* network,
+bool ProxyConfigServiceImpl::ParseProxyConfig(const NetworkState& network,
net::ProxyConfig* proxy_config) {
- if (!network || !proxy_config)
- return false;
- JSONStringValueSerializer serializer(network->proxy_config());
- scoped_ptr<Value> value(serializer.Deserialize(NULL, NULL));
- if (!value.get() || value->GetType() != Value::TYPE_DICTIONARY)
+ if (!proxy_config || network.proxy_config().empty())
return false;
- ProxyConfigDictionary proxy_dict(static_cast<DictionaryValue*>(value.get()));
+
+ ProxyConfigDictionary proxy_dict(&network.proxy_config());
return PrefProxyConfigTrackerImpl::PrefConfigToNetConfig(proxy_dict,
proxy_config);
}
@@ -606,17 +595,7 @@ void ProxyConfigServiceImpl::RegisterUserPrefs(
void ProxyConfigServiceImpl::OnUseSharedProxiesChanged() {
VLOG(1) << "New use-shared-proxies = " << GetUseSharedProxies();
-
- // Determine new proxy config which may have changed because of new
- // use-shared-proxies. If necessary, activate it.
- Network* network = NULL;
- if (!active_network_.empty()) {
- network = CrosLibrary::Get()->GetNetworkLibrary()->FindNetworkByPath(
- active_network_);
- if (!network)
- LOG(WARNING) << "Can't find requested network " << active_network_;
- }
- DetermineEffectiveConfig(network, true);
+ UpdateProxyConfigOfDefaultNetwork();
}
void ProxyConfigServiceImpl::OnUISetProxyConfig() {
@@ -632,58 +611,34 @@ void ProxyConfigServiceImpl::OnUISetProxyConfig() {
}
}
-void ProxyConfigServiceImpl::OnActiveNetworkChanged(NetworkLibrary* network_lib,
- const Network* active_network) {
- std::string new_network;
- if (active_network)
- new_network = active_network->service_path();
-
- if (active_network_ == new_network) { // Same active network.
- VLOG(1) << "Same active network: "
- << (new_network.empty() ? "empty" :
- (active_network->name().empty() ?
- new_network : active_network->name()));
- // Even though network is the same, its proxy config (e.g. if private
- // version of network replaces the shared version after login), or
- // use-shared-proxies setting (e.g. after login) may have changed,
- // so re-determine effective proxy config, and activate if different.
- if (active_network) {
- VLOG(1) << "Profile=" << active_network->profile_type()
- << "," << active_network->profile_path()
- << ", proxy=" << active_network->proxy_config();
- DetermineEffectiveConfig(active_network, true);
- }
- return;
- }
+void ProxyConfigServiceImpl::DefaultNetworkChanged(
+ const NetworkState* new_network) {
+ std::string new_network_path;
+ if (new_network)
+ new_network_path = new_network->path();
- // If there was a previous active network, remove it as observer.
- if (!active_network_.empty())
- network_lib->RemoveNetworkObserver(active_network_, this);
+ VLOG(1) << "DefaultNetworkChanged: network "
+ << default_network_ << " -> " << new_network_path << ".";
+ VLOG_IF(1, new_network) << "New network: name=" << new_network->name()
+ << ", proxy=" << new_network->proxy_config()
+ << ", profile=" << new_network->profile_path();
- active_network_ = new_network;
+ default_network_ = new_network_path;
- if (active_network_.empty()) {
- VLOG(1) << "New active network: empty";
- DetermineEffectiveConfig(active_network, true);
- return;
- }
-
- VLOG(1) << "New active network: path=" << active_network->service_path()
- << ", name=" << active_network->name()
- << ", profile=" << active_network->profile_type()
- << "," << active_network->profile_path()
- << ", proxy=" << active_network->proxy_config();
-
- // Register observer for new network.
- network_lib->AddNetworkObserver(active_network_, this);
+ // Even if the default network is the same, its proxy config (e.g. if private
+ // version of network replaces the shared version after login), or
+ // use-shared-proxies setting (e.g. after login) may have changed, so
+ // re-determine effective proxy config, and activate if different.
- // If necessary, migrate config to shill.
- if (active_network->proxy_config().empty() && !device_config_.empty()) {
- VLOG(1) << "Try migrating device config to " << active_network_;
- SetProxyConfigForNetwork(active_network_, device_config_, true);
+ // If necessary, migrate device proxy settings to per network settings.
+ if (new_network && new_network->proxy_config().empty() &&
+ !device_config_.empty()) {
+ VLOG(1) << "Try migrating device config to " << new_network_path;
+ SetProxyConfigForNetwork(new_network_path, device_config_, true);
+ // This will trigger a notification afterwards, so application
+ // of the migrated proxy config is not necessary here.
} else {
- // Otherwise, determine and activate possibly new effective proxy config.
- DetermineEffectiveConfig(active_network, true);
+ UpdateProxyConfigOfDefaultNetwork();
}
}
@@ -701,8 +656,8 @@ void ProxyConfigServiceImpl::SetProxyConfigForNetwork(
VLOG(1) << "Set proxy for "
<< (network->name().empty() ? network_path : network->name())
<< ", value=" << value;
- if (network_path == active_network_)
- DetermineEffectiveConfig(network, true);
+ // Even in case the default network was changed, there's no need to apply
+ // the new proxy settings, because we will be notified afterwards.
}
}
@@ -716,18 +671,22 @@ bool ProxyConfigServiceImpl::GetUseSharedProxies() {
return use_shared_proxies_.GetValue();
}
-bool ProxyConfigServiceImpl::IgnoreProxy(const Network* network) {
- if (network->profile_type() == PROFILE_USER)
+bool ProxyConfigServiceImpl::IgnoreProxy(const NetworkState& network) {
+ const NetworkProfile* profile =
+ NetworkProfileHandler::Get()->GetProfileForPath(network.profile_path());
+ if (!profile)
+ return true;
+ if (profile->type() == NetworkProfile::TYPE_USER)
return false;
- if (network->ui_data().onc_source() == onc::ONC_SOURCE_DEVICE_POLICY &&
+ if (network.onc_source() == onc::ONC_SOURCE_DEVICE_POLICY &&
UserManager::Get()->IsUserLoggedIn()) {
policy::BrowserPolicyConnector* connector =
g_browser_process->browser_policy_connector();
const User* logged_in_user = UserManager::Get()->GetLoggedInUser();
if (connector->GetUserAffiliation(logged_in_user->email()) ==
policy::USER_AFFILIATION_MANAGED) {
- VLOG(1) << "Respecting proxy for network " << network->name()
+ VLOG(1) << "Respecting proxy for network " << network.name()
<< ", as logged-in user belongs to the domain the device "
<< "is enrolled to.";
return false;
@@ -737,8 +696,18 @@ bool ProxyConfigServiceImpl::IgnoreProxy(const Network* network) {
return !GetUseSharedProxies();
}
-void ProxyConfigServiceImpl::DetermineEffectiveConfig(const Network* network,
- bool activate) {
+void ProxyConfigServiceImpl::UpdateProxyConfigOfDefaultNetwork() {
+ const NetworkState* network = NetworkStateHandler::Get()->DefaultNetwork();
+ LOG_IF(ERROR, network && network->path() != default_network_)
Mattias Nissler (ping if slow) 2013/05/08 12:46:36 Should this be a DLOG_IF?
pneubeck (no reviews) 2013/05/08 18:32:14 Hm. It would be interesting to know about this cas
Mattias Nissler (ping if slow) 2013/05/10 12:17:31 If this is in the "program logic error that cannot
+ << "Default network changed without notification. "
+ << "Known default network: " << default_network_
+ << ". Actual default network: " << network->path();
+ DetermineEffectiveConfig(network, true);
+}
+
+void ProxyConfigServiceImpl::DetermineEffectiveConfig(
+ const NetworkState* network,
+ bool activate) {
// Get prefs proxy config if available.
net::ProxyConfig pref_config;
ProxyPrefs::ConfigState pref_state = GetProxyConfig(&pref_config);
@@ -751,18 +720,16 @@ void ProxyConfigServiceImpl::DetermineEffectiveConfig(const Network* network,
if (network) {
// If we're activating proxy, ignore proxy if necessary;
// otherwise, for ui, get actual proxy to show user.
- ignore_proxy = activate ? IgnoreProxy(network) : false;
+ ignore_proxy = activate ? IgnoreProxy(*network) : false;
// If network is shared but use-shared-proxies is off, use direct mode.
if (ignore_proxy) {
VLOG(1) << "Shared network && !use-shared-proxies, use direct";
network_availability = net::ProxyConfigService::CONFIG_VALID;
- } else if (!network->proxy_config().empty()) {
+ } else if (ParseProxyConfig(*network, &network_config)) {
// Network is private or shared with user using shared proxies.
- if (ParseProxyConfig(network, &network_config)) {
- VLOG(1) << this << ": using network proxy: "
- << network->proxy_config();
- network_availability = net::ProxyConfigService::CONFIG_VALID;
- }
+ VLOG(1) << this << ": using network proxy: "
+ << network->proxy_config();
+ network_availability = net::ProxyConfigService::CONFIG_VALID;
}
}
@@ -800,47 +767,26 @@ void ProxyConfigServiceImpl::DetermineEffectiveConfig(const Network* network,
PrefProxyConfigTrackerImpl::OnProxyConfigChanged(effective_config_state,
effective_config);
if (VLOG_IS_ON(1) && !update_pending()) { // Update was successful.
- scoped_ptr<DictionaryValue> config_dict(static_cast<DictionaryValue*>(
- effective_config.ToValue()));
- std::string config_value;
- JSONStringValueSerializer serializer(&config_value);
- serializer.Serialize(*config_dict.get());
+ scoped_ptr<base::DictionaryValue> config_dict(
+ effective_config.ToValue());
VLOG(1) << this << ": Proxy changed: "
<< ConfigStateToString(active_config_state_)
- << ", " << config_value;
+ << ", " << *config_dict;
}
}
} else { // For UI, store effective proxy into |current_ui_config_|.
+ DCHECK(network);
current_ui_config_.FromNetProxyConfig(effective_config);
current_ui_config_.state = effective_config_state;
if (PrefPrecedes(effective_config_state)) {
current_ui_config_.user_modifiable = false;
- } else if (!IsNetworkProxySettingsEditable(network)) {
+ } else if (!IsNetworkProxySettingsEditable(*network)) {
// TODO(xiyuan): Figure out the right way to set config state for managed
// network.
current_ui_config_.state = ProxyPrefs::CONFIG_POLICY;
current_ui_config_.user_modifiable = false;
} else {
- current_ui_config_.user_modifiable = !network || !IgnoreProxy(network);
- }
- }
-}
-
-void ProxyConfigServiceImpl::OnUISetCurrentNetwork(const Network* network) {
- DetermineEffectiveConfig(network, false);
- VLOG(1) << "Current ui network: "
- << (network->name().empty() ? current_ui_network_ : network->name())
- << ", " << ModeToString(current_ui_config_.mode)
- << ", " << ConfigStateToString(current_ui_config_.state)
- << ", modifiable:" << current_ui_config_.user_modifiable;
- // Notify whoever is interested in this change.
- std::vector<base::Closure>::iterator iter = callbacks_.begin();
- while (iter != callbacks_.end()) {
- if (iter->is_null()) {
- iter = callbacks_.erase(iter);
- } else {
- iter->Run();
- ++iter;
+ current_ui_config_.user_modifiable = !IgnoreProxy(*network);
}
}
}
@@ -875,9 +821,11 @@ void ProxyConfigServiceImpl::FetchProxyPolicy() {
device_config_.clear();
return;
}
- if (!active_network_.empty()) {
- VLOG(1) << "Try migrating device config to " << active_network_;
- SetProxyConfigForNetwork(active_network_, device_config_, true);
+ const NetworkState* default_network =
+ NetworkStateHandler::Get()->DefaultNetwork();
+ if (default_network) {
+ VLOG(1) << "Try migrating device config to " << default_network->path();
+ SetProxyConfigForNetwork(default_network->path(), device_config_, true);
}
}

Powered by Google App Engine
This is Rietveld 408576698