Fix Linux proxy settings retrieval.

Only the environment variables were being consulted and not the desktop environment's settings.

Bug: 843942
Change-Id: I22c850717565b219f8ac0dc7566085cccc81af08
Reviewed-on: https://chromium-review.googlesource.com/1066562
Reviewed-by: Matt Mueller <[email protected]>
Commit-Queue: Eric Roman <[email protected]>
Cr-Commit-Position: refs/heads/master@{#560054}
diff --git a/net/proxy_resolution/proxy_config_service_linux.cc b/net/proxy_resolution/proxy_config_service_linux.cc
index 356095a..a19ab9b7 100644
--- a/net/proxy_resolution/proxy_config_service_linux.cc
+++ b/net/proxy_resolution/proxy_config_service_linux.cc
@@ -19,6 +19,7 @@
 #include "base/files/scoped_file.h"
 #include "base/logging.h"
 #include "base/macros.h"
+#include "base/memory/ptr_util.h"
 #include "base/nix/xdg_util.h"
 #include "base/sequenced_task_runner.h"
 #include "base/single_thread_task_runner.h"
@@ -1159,18 +1160,23 @@
 
   return ProxyConfigWithAnnotation(
       config, NetworkTrafficAnnotationTag(traffic_annotation_));
-  ;
 }
 
-ProxyConfigServiceLinux::Delegate::Delegate()
-    : env_var_getter_(base::Environment::Create()) {}
-
 ProxyConfigServiceLinux::Delegate::Delegate(
     std::unique_ptr<base::Environment> env_var_getter,
-    const NetworkTrafficAnnotationTag& traffic_annotation)
-    : env_var_getter_(std::move(env_var_getter)),
-      traffic_annotation_(
-          MutableNetworkTrafficAnnotationTag(traffic_annotation)) {
+    base::Optional<std::unique_ptr<SettingGetter>> setting_getter,
+    base::Optional<NetworkTrafficAnnotationTag> traffic_annotation)
+    : env_var_getter_(std::move(env_var_getter)) {
+  if (traffic_annotation) {
+    traffic_annotation_ =
+        MutableNetworkTrafficAnnotationTag(traffic_annotation.value());
+  }
+
+  if (setting_getter) {
+    setting_getter_ = std::move(setting_getter.value());
+    return;
+  }
+
   // Figure out which SettingGetterImpl to use, if any.
   switch (base::nix::GetDesktopEnvironment(env_var_getter_.get())) {
     case base::nix::DESKTOP_ENVIRONMENT_CINNAMON:
@@ -1199,15 +1205,6 @@
   }
 }
 
-ProxyConfigServiceLinux::Delegate::Delegate(
-    std::unique_ptr<base::Environment> env_var_getter,
-    SettingGetter* setting_getter,
-    const NetworkTrafficAnnotationTag& traffic_annotation)
-    : env_var_getter_(std::move(env_var_getter)),
-      setting_getter_(setting_getter),
-      traffic_annotation_(
-          MutableNetworkTrafficAnnotationTag(traffic_annotation)) {}
-
 void ProxyConfigServiceLinux::Delegate::SetUpAndFetchInitialConfig(
     const scoped_refptr<base::SingleThreadTaskRunner>& glib_task_runner,
     const scoped_refptr<base::SequencedTaskRunner>& main_task_runner,
@@ -1387,7 +1384,9 @@
 }
 
 ProxyConfigServiceLinux::ProxyConfigServiceLinux()
-    : delegate_(new Delegate()) {}
+    : delegate_(new Delegate(base::Environment::Create(),
+                             base::nullopt,
+                             base::nullopt)) {}
 
 ProxyConfigServiceLinux::~ProxyConfigServiceLinux() {
   delegate_->PostDestroyTask();
@@ -1396,14 +1395,16 @@
 ProxyConfigServiceLinux::ProxyConfigServiceLinux(
     std::unique_ptr<base::Environment> env_var_getter,
     const NetworkTrafficAnnotationTag& traffic_annotation)
-    : delegate_(new Delegate(std::move(env_var_getter), traffic_annotation)) {}
+    : delegate_(new Delegate(std::move(env_var_getter),
+                             base::nullopt,
+                             traffic_annotation)) {}
 
 ProxyConfigServiceLinux::ProxyConfigServiceLinux(
     std::unique_ptr<base::Environment> env_var_getter,
     SettingGetter* setting_getter,
     const NetworkTrafficAnnotationTag& traffic_annotation)
     : delegate_(new Delegate(std::move(env_var_getter),
-                             setting_getter,
+                             base::WrapUnique(setting_getter),
                              traffic_annotation)) {}
 
 void ProxyConfigServiceLinux::AddObserver(Observer* observer) {