| Index: net/proxy/proxy_config_service_linux.cc
|
| diff --git a/net/proxy/proxy_config_service_linux.cc b/net/proxy/proxy_config_service_linux.cc
|
| index d6f89db918dd6019bbf7c63022025cfacbeb551d..6f9add06d47938a0829daf39f3558d0324123842 100644
|
| --- a/net/proxy/proxy_config_service_linux.cc
|
| +++ b/net/proxy/proxy_config_service_linux.cc
|
| @@ -15,6 +15,7 @@
|
| #include <unistd.h>
|
|
|
| #include <map>
|
| +#include <utility>
|
|
|
| #include "base/bind.h"
|
| #include "base/compiler_specific.h"
|
| @@ -94,27 +95,30 @@ ProxyConfigServiceLinux::Delegate::~Delegate() {
|
| }
|
|
|
| bool ProxyConfigServiceLinux::Delegate::GetProxyFromEnvVarForScheme(
|
| - const char* variable, ProxyServer::Scheme scheme,
|
| + base::StringPiece variable,
|
| + ProxyServer::Scheme scheme,
|
| ProxyServer* result_server) {
|
| std::string env_value;
|
| - if (env_var_getter_->GetVar(variable, &env_value)) {
|
| - if (!env_value.empty()) {
|
| - env_value = FixupProxyHostScheme(scheme, env_value);
|
| - ProxyServer proxy_server =
|
| - ProxyServer::FromURI(env_value, ProxyServer::SCHEME_HTTP);
|
| - if (proxy_server.is_valid() && !proxy_server.is_direct()) {
|
| - *result_server = proxy_server;
|
| - return true;
|
| - } else {
|
| - LOG(ERROR) << "Failed to parse environment variable " << variable;
|
| - }
|
| - }
|
| + if (!env_var_getter_->GetVar(variable, &env_value))
|
| + return false;
|
| +
|
| + if (env_value.empty())
|
| + return false;
|
| +
|
| + env_value = FixupProxyHostScheme(scheme, env_value);
|
| + ProxyServer proxy_server =
|
| + ProxyServer::FromURI(env_value, ProxyServer::SCHEME_HTTP);
|
| + if (proxy_server.is_valid() && !proxy_server.is_direct()) {
|
| + *result_server = proxy_server;
|
| + return true;
|
| }
|
| + LOG(ERROR) << "Failed to parse environment variable " << variable;
|
| return false;
|
| }
|
|
|
| bool ProxyConfigServiceLinux::Delegate::GetProxyFromEnvVar(
|
| - const char* variable, ProxyServer* result_server) {
|
| + base::StringPiece variable,
|
| + ProxyServer* result_server) {
|
| return GetProxyFromEnvVarForScheme(variable, ProxyServer::SCHEME_HTTP,
|
| result_server);
|
| }
|
| @@ -202,10 +206,10 @@ const int kDebounceTimeoutMilliseconds = 250;
|
| class SettingGetterImplGConf : public ProxyConfigServiceLinux::SettingGetter {
|
| public:
|
| SettingGetterImplGConf()
|
| - : client_(NULL),
|
| + : client_(nullptr),
|
| system_proxy_id_(0),
|
| system_http_proxy_id_(0),
|
| - notify_delegate_(NULL),
|
| + notify_delegate_(nullptr),
|
| debounce_timer_(new base::OneShotTimer()) {}
|
|
|
| ~SettingGetterImplGConf() override {
|
| @@ -246,10 +250,10 @@ class SettingGetterImplGConf : public ProxyConfigServiceLinux::SettingGetter {
|
| if (!client_) {
|
| // It's not clear whether/when this can return NULL.
|
| LOG(ERROR) << "Unable to create a gconf client";
|
| - task_runner_ = NULL;
|
| + task_runner_ = nullptr;
|
| return false;
|
| }
|
| - GError* error = NULL;
|
| + GError* error = nullptr;
|
| bool added_system_proxy = false;
|
| // We need to add the directories for which we'll be asking
|
| // for notifications, and we might as well ask to preload them.
|
| @@ -257,22 +261,22 @@ class SettingGetterImplGConf : public ProxyConfigServiceLinux::SettingGetter {
|
| // here to only leave client_ non-NULL if both have been added.
|
| gconf_client_add_dir(client_, "/system/proxy",
|
| GCONF_CLIENT_PRELOAD_ONELEVEL, &error);
|
| - if (error == NULL) {
|
| + if (!error) {
|
| added_system_proxy = true;
|
| gconf_client_add_dir(client_, "/system/http_proxy",
|
| GCONF_CLIENT_PRELOAD_ONELEVEL, &error);
|
| }
|
| - if (error != NULL) {
|
| - LOG(ERROR) << "Error requesting gconf directory: " << error->message;
|
| - g_error_free(error);
|
| - if (added_system_proxy)
|
| - gconf_client_remove_dir(client_, "/system/proxy", NULL);
|
| - g_object_unref(client_);
|
| - client_ = NULL;
|
| - task_runner_ = NULL;
|
| - return false;
|
| - }
|
| - return true;
|
| + if (!error)
|
| + return true;
|
| +
|
| + LOG(ERROR) << "Error requesting gconf directory: " << error->message;
|
| + g_error_free(error);
|
| + if (added_system_proxy)
|
| + gconf_client_remove_dir(client_, "/system/proxy", nullptr);
|
| + g_object_unref(client_);
|
| + client_ = nullptr;
|
| + task_runner_ = nullptr;
|
| + return false;
|
| }
|
|
|
| void ShutDown() override {
|
| @@ -284,11 +288,11 @@ class SettingGetterImplGConf : public ProxyConfigServiceLinux::SettingGetter {
|
| // own, which is destroyed when the session ends.)
|
| gconf_client_notify_remove(client_, system_http_proxy_id_);
|
| gconf_client_notify_remove(client_, system_proxy_id_);
|
| - gconf_client_remove_dir(client_, "/system/http_proxy", NULL);
|
| - gconf_client_remove_dir(client_, "/system/proxy", NULL);
|
| + gconf_client_remove_dir(client_, "/system/http_proxy", nullptr);
|
| + gconf_client_remove_dir(client_, "/system/proxy", nullptr);
|
| g_object_unref(client_);
|
| - client_ = NULL;
|
| - task_runner_ = NULL;
|
| + client_ = nullptr;
|
| + task_runner_ = nullptr;
|
| }
|
| debounce_timer_.reset();
|
| }
|
| @@ -297,30 +301,29 @@ class SettingGetterImplGConf : public ProxyConfigServiceLinux::SettingGetter {
|
| ProxyConfigServiceLinux::Delegate* delegate) override {
|
| DCHECK(client_);
|
| DCHECK(task_runner_->BelongsToCurrentThread());
|
| - GError* error = NULL;
|
| + GError* error = nullptr;
|
| notify_delegate_ = delegate;
|
| // We have to keep track of the IDs returned by gconf_client_notify_add() so
|
| // that we can remove them in ShutDown(). (Otherwise, notifications will be
|
| // delivered to this object after it is deleted, which is bad, m'kay?)
|
| - system_proxy_id_ = gconf_client_notify_add(
|
| - client_, "/system/proxy",
|
| - OnGConfChangeNotification, this,
|
| - NULL, &error);
|
| - if (error == NULL) {
|
| + system_proxy_id_ = gconf_client_notify_add(client_, "/system/proxy",
|
| + OnGConfChangeNotification, this,
|
| + nullptr, &error);
|
| + if (!error) {
|
| system_http_proxy_id_ = gconf_client_notify_add(
|
| - client_, "/system/http_proxy",
|
| - OnGConfChangeNotification, this,
|
| - NULL, &error);
|
| + client_, "/system/http_proxy", OnGConfChangeNotification, this,
|
| + nullptr, &error);
|
| }
|
| - if (error != NULL) {
|
| - LOG(ERROR) << "Error requesting gconf notifications: " << error->message;
|
| - g_error_free(error);
|
| - ShutDown();
|
| - return false;
|
| + if (!error) {
|
| + // Simulate a change to avoid possibly losing updates before this point.
|
| + OnChangeNotification();
|
| + return true;
|
| }
|
| - // Simulate a change to avoid possibly losing updates before this point.
|
| - OnChangeNotification();
|
| - return true;
|
| +
|
| + LOG(ERROR) << "Error requesting gconf notifications: " << error->message;
|
| + g_error_free(error);
|
| + ShutDown();
|
| + return false;
|
| }
|
|
|
| const scoped_refptr<base::SingleThreadTaskRunner>& GetNotificationTaskRunner()
|
| @@ -390,12 +393,12 @@ class SettingGetterImplGConf : public ProxyConfigServiceLinux::SettingGetter {
|
| bool MatchHostsUsingSuffixMatching() override { return false; }
|
|
|
| private:
|
| - bool GetStringByPath(const char* key, std::string* result) {
|
| + bool GetStringByPath(base::StringPiece key, std::string* result) {
|
| DCHECK(client_);
|
| DCHECK(task_runner_->BelongsToCurrentThread());
|
| - GError* error = NULL;
|
| - gchar* value = gconf_client_get_string(client_, key, &error);
|
| - if (HandleGError(error, key))
|
| + GError* error = nullptr;
|
| + gchar* value = gconf_client_get_string(client_, key.data(), &error);
|
| + if (HandleGError(error, key.data()))
|
| return false;
|
| if (!value)
|
| return false;
|
| @@ -403,15 +406,15 @@ class SettingGetterImplGConf : public ProxyConfigServiceLinux::SettingGetter {
|
| g_free(value);
|
| return true;
|
| }
|
| - bool GetBoolByPath(const char* key, bool* result) {
|
| + bool GetBoolByPath(base::StringPiece key, bool* result) {
|
| DCHECK(client_);
|
| DCHECK(task_runner_->BelongsToCurrentThread());
|
| - GError* error = NULL;
|
| + GError* error = nullptr;
|
| // We want to distinguish unset values from values defaulting to
|
| // false. For that we need to use the type-generic
|
| // gconf_client_get() rather than gconf_client_get_bool().
|
| - GConfValue* gconf_value = gconf_client_get(client_, key, &error);
|
| - if (HandleGError(error, key))
|
| + GConfValue* gconf_value = gconf_client_get(client_, key.data(), &error);
|
| + if (HandleGError(error, key.data()))
|
| return false;
|
| if (!gconf_value) {
|
| // Unset.
|
| @@ -426,25 +429,26 @@ class SettingGetterImplGConf : public ProxyConfigServiceLinux::SettingGetter {
|
| gconf_value_free(gconf_value);
|
| return true;
|
| }
|
| - bool GetIntByPath(const char* key, int* result) {
|
| + bool GetIntByPath(base::StringPiece key, int* result) {
|
| DCHECK(client_);
|
| DCHECK(task_runner_->BelongsToCurrentThread());
|
| - GError* error = NULL;
|
| - int value = gconf_client_get_int(client_, key, &error);
|
| - if (HandleGError(error, key))
|
| + GError* error = nullptr;
|
| + int value = gconf_client_get_int(client_, key.data(), &error);
|
| + if (HandleGError(error, key.data()))
|
| return false;
|
| // We don't bother to distinguish an unset value because callers
|
| // don't care. 0 is returned if unset.
|
| *result = value;
|
| return true;
|
| }
|
| - bool GetStringListByPath(const char* key, std::vector<std::string>* result) {
|
| + bool GetStringListByPath(base::StringPiece key,
|
| + std::vector<std::string>* result) {
|
| DCHECK(client_);
|
| DCHECK(task_runner_->BelongsToCurrentThread());
|
| - GError* error = NULL;
|
| - GSList* list = gconf_client_get_list(client_, key,
|
| - GCONF_VALUE_STRING, &error);
|
| - if (HandleGError(error, key))
|
| + GError* error = nullptr;
|
| + GSList* list =
|
| + gconf_client_get_list(client_, key.data(), GCONF_VALUE_STRING, &error);
|
| + if (HandleGError(error, key.data()))
|
| return false;
|
| if (!list)
|
| return false;
|
| @@ -458,14 +462,14 @@ class SettingGetterImplGConf : public ProxyConfigServiceLinux::SettingGetter {
|
|
|
| // Logs and frees a glib error. Returns false if there was no error
|
| // (error is NULL).
|
| - bool HandleGError(GError* error, const char* key) {
|
| - if (error != NULL) {
|
| - LOG(ERROR) << "Error getting gconf value for " << key
|
| - << ": " << error->message;
|
| - g_error_free(error);
|
| - return true;
|
| - }
|
| - return false;
|
| + bool HandleGError(GError* error, base::StringPiece key) {
|
| + if (!error)
|
| + return false;
|
| +
|
| + LOG(ERROR) << "Error getting gconf value for " << key << ": "
|
| + << error->message;
|
| + g_error_free(error);
|
| + return true;
|
| }
|
|
|
| // This is the callback from the debounce timer.
|
| @@ -522,12 +526,12 @@ class SettingGetterImplGSettings
|
| : public ProxyConfigServiceLinux::SettingGetter {
|
| public:
|
| SettingGetterImplGSettings()
|
| - : client_(NULL),
|
| - http_client_(NULL),
|
| - https_client_(NULL),
|
| - ftp_client_(NULL),
|
| - socks_client_(NULL),
|
| - notify_delegate_(NULL),
|
| + : client_(nullptr),
|
| + http_client_(nullptr),
|
| + https_client_(nullptr),
|
| + ftp_client_(nullptr),
|
| + socks_client_(nullptr),
|
| + notify_delegate_(nullptr),
|
| debounce_timer_(new base::OneShotTimer()) {}
|
|
|
| ~SettingGetterImplGSettings() override {
|
| @@ -547,16 +551,16 @@ class SettingGetterImplGSettings
|
| ShutDown();
|
| } else {
|
| LOG(WARNING) << "~SettingGetterImplGSettings: leaking gsettings client";
|
| - client_ = NULL;
|
| + client_ = nullptr;
|
| }
|
| }
|
| DCHECK(!client_);
|
| }
|
|
|
| - bool SchemaExists(const char* schema_name) {
|
| + bool SchemaExists(base::StringPiece schema_name) {
|
| const gchar* const* schemas = libgio_loader_.g_settings_list_schemas();
|
| while (*schemas) {
|
| - if (strcmp(schema_name, static_cast<const char*>(*schemas)) == 0)
|
| + if (!strcmp(schema_name.data(), static_cast<const char*>(*schemas)))
|
| return true;
|
| schemas++;
|
| }
|
| @@ -599,8 +603,8 @@ class SettingGetterImplGSettings
|
| g_object_unref(http_client_);
|
| g_object_unref(client_);
|
| // We only need to null client_ because it's the only one that we check.
|
| - client_ = NULL;
|
| - task_runner_ = NULL;
|
| + client_ = nullptr;
|
| + task_runner_ = nullptr;
|
| }
|
| debounce_timer_.reset();
|
| }
|
| @@ -705,31 +709,33 @@ class SettingGetterImplGSettings
|
| bool MatchHostsUsingSuffixMatching() override { return false; }
|
|
|
| private:
|
| - bool GetStringByPath(GSettings* client, const char* key,
|
| + bool GetStringByPath(GSettings* client,
|
| + base::StringPiece key,
|
| std::string* result) {
|
| DCHECK(task_runner_->BelongsToCurrentThread());
|
| - gchar* value = libgio_loader_.g_settings_get_string(client, key);
|
| + gchar* value = libgio_loader_.g_settings_get_string(client, key.data());
|
| if (!value)
|
| return false;
|
| *result = value;
|
| g_free(value);
|
| return true;
|
| }
|
| - bool GetBoolByPath(GSettings* client, const char* key, bool* result) {
|
| + bool GetBoolByPath(GSettings* client, base::StringPiece key, bool* result) {
|
| DCHECK(task_runner_->BelongsToCurrentThread());
|
| *result = static_cast<bool>(
|
| - libgio_loader_.g_settings_get_boolean(client, key));
|
| + libgio_loader_.g_settings_get_boolean(client, key.data()));
|
| return true;
|
| }
|
| - bool GetIntByPath(GSettings* client, const char* key, int* result) {
|
| + bool GetIntByPath(GSettings* client, base::StringPiece key, int* result) {
|
| DCHECK(task_runner_->BelongsToCurrentThread());
|
| - *result = libgio_loader_.g_settings_get_int(client, key);
|
| + *result = libgio_loader_.g_settings_get_int(client, key.data());
|
| return true;
|
| }
|
| - bool GetStringListByPath(GSettings* client, const char* key,
|
| + bool GetStringListByPath(GSettings* client,
|
| + base::StringPiece key,
|
| std::vector<std::string>* result) {
|
| DCHECK(task_runner_->BelongsToCurrentThread());
|
| - gchar** list = libgio_loader_.g_settings_get_strv(client, key);
|
| + gchar** list = libgio_loader_.g_settings_get_strv(client, key.data());
|
| if (!list)
|
| return false;
|
| for (size_t i = 0; list[i]; ++i) {
|
| @@ -821,9 +827,9 @@ bool SettingGetterImplGSettings::LoadAndCheckVersion(
|
| }
|
| }
|
|
|
| - GSettings* client = NULL;
|
| + GSettings* client = nullptr;
|
| if (SchemaExists(kProxyGConfSchema)) {
|
| - ANNOTATE_SCOPED_MEMORY_LEAK; // http://crbug.com/380782
|
| + ANNOTATE_SCOPED_MEMORY_LEAK; // http://crbug.com/380782
|
| client = libgio_loader_.g_settings_new(kProxyGConfSchema);
|
| }
|
| if (!client) {
|
| @@ -857,13 +863,13 @@ class SettingGetterImplKDE : public ProxyConfigServiceLinux::SettingGetter,
|
| public:
|
| explicit SettingGetterImplKDE(base::Environment* env_var_getter)
|
| : inotify_fd_(-1),
|
| - notify_delegate_(NULL),
|
| + notify_delegate_(nullptr),
|
| debounce_timer_(new base::OneShotTimer()),
|
| indirect_manual_(false),
|
| auto_no_pac_(false),
|
| reversed_bypass_list_(false),
|
| env_var_getter_(env_var_getter),
|
| - file_task_runner_(NULL) {
|
| + file_task_runner_(nullptr) {
|
| // This has to be called on the UI thread (http://crbug.com/69057).
|
| base::ThreadRestrictions::ScopedAllowIO allow_io;
|
|
|
| @@ -933,7 +939,7 @@ class SettingGetterImplKDE : public ProxyConfigServiceLinux::SettingGetter,
|
| // anyway. (Not that it really matters; the process is exiting.)
|
| if (inotify_fd_ >= 0)
|
| ShutDown();
|
| - DCHECK(inotify_fd_ < 0);
|
| + DCHECK_LT(inotify_fd_, 0);
|
| }
|
|
|
| bool Init(const scoped_refptr<base::SingleThreadTaskRunner>& glib_task_runner,
|
| @@ -941,7 +947,7 @@ class SettingGetterImplKDE : public ProxyConfigServiceLinux::SettingGetter,
|
| override {
|
| // This has to be called on the UI thread (http://crbug.com/69057).
|
| base::ThreadRestrictions::ScopedAllowIO allow_io;
|
| - DCHECK(inotify_fd_ < 0);
|
| + DCHECK_LT(inotify_fd_, 0);
|
| inotify_fd_ = inotify_init();
|
| if (inotify_fd_ < 0) {
|
| PLOG(ERROR) << "inotify_init failed";
|
| @@ -973,7 +979,7 @@ class SettingGetterImplKDE : public ProxyConfigServiceLinux::SettingGetter,
|
|
|
| bool SetUpNotifications(
|
| ProxyConfigServiceLinux::Delegate* delegate) override {
|
| - DCHECK(inotify_fd_ >= 0);
|
| + DCHECK_GE(inotify_fd_, 0);
|
| DCHECK(file_task_runner_->BelongsToCurrentThread());
|
| // We can't just watch the kioslaverc file directly, since KDE will write
|
| // a new copy of it and then rename it whenever settings are changed and
|
| @@ -1528,10 +1534,11 @@ bool ProxyConfigServiceLinux::Delegate::GetConfigFromSettings(
|
| return true;
|
| }
|
|
|
| -ProxyConfigServiceLinux::Delegate::Delegate(base::Environment* env_var_getter)
|
| - : env_var_getter_(env_var_getter) {
|
| +ProxyConfigServiceLinux::Delegate::Delegate(
|
| + std::unique_ptr<base::Environment> env_var_getter)
|
| + : env_var_getter_(std::move(env_var_getter)) {
|
| // Figure out which SettingGetterImpl to use, if any.
|
| - switch (base::nix::GetDesktopEnvironment(env_var_getter)) {
|
| + switch (base::nix::GetDesktopEnvironment(env_var_getter_.get())) {
|
| case base::nix::DESKTOP_ENVIRONMENT_GNOME:
|
| case base::nix::DESKTOP_ENVIRONMENT_UNITY:
|
| #if defined(USE_GIO)
|
| @@ -1540,20 +1547,20 @@ ProxyConfigServiceLinux::Delegate::Delegate(base::Environment* env_var_getter)
|
| new SettingGetterImplGSettings());
|
| // We have to load symbols and check the GNOME version in use to decide
|
| // if we should use the gsettings getter. See LoadAndCheckVersion().
|
| - if (gs_getter->LoadAndCheckVersion(env_var_getter))
|
| + if (gs_getter->LoadAndCheckVersion(env_var_getter_.get()))
|
| setting_getter_.reset(gs_getter.release());
|
| }
|
| #endif
|
| #if defined(USE_GCONF)
|
| // Fall back on gconf if gsettings is unavailable or incorrect.
|
| - if (!setting_getter_.get())
|
| + if (!setting_getter_)
|
| setting_getter_.reset(new SettingGetterImplGConf());
|
| #endif
|
| break;
|
| case base::nix::DESKTOP_ENVIRONMENT_KDE3:
|
| case base::nix::DESKTOP_ENVIRONMENT_KDE4:
|
| case base::nix::DESKTOP_ENVIRONMENT_KDE5:
|
| - setting_getter_.reset(new SettingGetterImplKDE(env_var_getter));
|
| + setting_getter_.reset(new SettingGetterImplKDE(env_var_getter_.get()));
|
| break;
|
| case base::nix::DESKTOP_ENVIRONMENT_XFCE:
|
| case base::nix::DESKTOP_ENVIRONMENT_OTHER:
|
| @@ -1562,9 +1569,10 @@ ProxyConfigServiceLinux::Delegate::Delegate(base::Environment* env_var_getter)
|
| }
|
|
|
| ProxyConfigServiceLinux::Delegate::Delegate(
|
| - base::Environment* env_var_getter, SettingGetter* setting_getter)
|
| - : env_var_getter_(env_var_getter), setting_getter_(setting_getter) {
|
| -}
|
| + std::unique_ptr<base::Environment> env_var_getter,
|
| + SettingGetter* setting_getter)
|
| + : env_var_getter_(std::move(env_var_getter)),
|
| + setting_getter_(setting_getter) {}
|
|
|
| void ProxyConfigServiceLinux::Delegate::SetUpAndFetchInitialConfig(
|
| const scoped_refptr<base::SingleThreadTaskRunner>& glib_task_runner,
|
| @@ -1595,7 +1603,7 @@ void ProxyConfigServiceLinux::Delegate::SetUpAndFetchInitialConfig(
|
| // mislead us.
|
|
|
| bool got_config = false;
|
| - if (setting_getter_.get() &&
|
| + if (setting_getter_ &&
|
| setting_getter_->Init(glib_task_runner, file_task_runner) &&
|
| GetConfigFromSettings(&cached_config_)) {
|
| cached_config_.set_id(1); // Mark it as valid.
|
| @@ -1727,8 +1735,9 @@ void ProxyConfigServiceLinux::Delegate::SetNewProxyConfig(
|
| }
|
|
|
| void ProxyConfigServiceLinux::Delegate::PostDestroyTask() {
|
| - if (!setting_getter_.get())
|
| + if (!setting_getter_)
|
| return;
|
| +
|
| scoped_refptr<base::SingleThreadTaskRunner> shutdown_loop =
|
| setting_getter_->GetNotificationTaskRunner();
|
| if (!shutdown_loop.get() || shutdown_loop->BelongsToCurrentThread()) {
|
| @@ -1758,14 +1767,13 @@ ProxyConfigServiceLinux::~ProxyConfigServiceLinux() {
|
| }
|
|
|
| ProxyConfigServiceLinux::ProxyConfigServiceLinux(
|
| - base::Environment* env_var_getter)
|
| - : delegate_(new Delegate(env_var_getter)) {
|
| -}
|
| + std::unique_ptr<base::Environment> env_var_getter)
|
| + : delegate_(new Delegate(std::move(env_var_getter))) {}
|
|
|
| ProxyConfigServiceLinux::ProxyConfigServiceLinux(
|
| - base::Environment* env_var_getter, SettingGetter* setting_getter)
|
| - : delegate_(new Delegate(env_var_getter, setting_getter)) {
|
| -}
|
| + std::unique_ptr<base::Environment> env_var_getter,
|
| + SettingGetter* setting_getter)
|
| + : delegate_(new Delegate(std::move(env_var_getter), setting_getter)) {}
|
|
|
| void ProxyConfigServiceLinux::AddObserver(Observer* observer) {
|
| delegate_->AddObserver(observer);
|
|
|