summaryrefslogtreecommitdiffstats
path: root/chrome/browser/webui/options/advanced_options_utils_gtk.cc
diff options
context:
space:
mode:
authortfarina@chromium.org <tfarina@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-02-19 14:12:23 +0000
committertfarina@chromium.org <tfarina@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-02-19 14:12:23 +0000
commit1ab7761d57f2144fac3f03958e571410b595a2b9 (patch)
treeb955a9d1e73f56d953339e852a7402faf9141a09 /chrome/browser/webui/options/advanced_options_utils_gtk.cc
parentc1338959f5d9fa970750a3007c52f3151b877232 (diff)
downloadchromium_src-1ab7761d57f2144fac3f03958e571410b595a2b9.zip
chromium_src-1ab7761d57f2144fac3f03958e571410b595a2b9.tar.gz
chromium_src-1ab7761d57f2144fac3f03958e571410b595a2b9.tar.bz2
WebUI: Move chrome/browser/dom_ui/options/ to chrome/browser/webui/options.
To reduce the size of this change I've left stub header files in chrome/browser/dom_ui/options. I'll updated the references and delete the stub files later. BUG=59945, 59946 TEST=trybots Review URL: http://codereview.chromium.org/6469067 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@75496 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/webui/options/advanced_options_utils_gtk.cc')
-rw-r--r--chrome/browser/webui/options/advanced_options_utils_gtk.cc145
1 files changed, 145 insertions, 0 deletions
diff --git a/chrome/browser/webui/options/advanced_options_utils_gtk.cc b/chrome/browser/webui/options/advanced_options_utils_gtk.cc
new file mode 100644
index 0000000..951e1a5
--- /dev/null
+++ b/chrome/browser/webui/options/advanced_options_utils_gtk.cc
@@ -0,0 +1,145 @@
+// Copyright (c) 2011 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.
+
+#if !defined(OS_CHROMEOS)
+
+#include "chrome/browser/dom_ui/options/advanced_options_utils.h"
+
+#include "base/file_util.h"
+#include "base/environment.h"
+#include "base/process_util.h"
+#include "base/string_tokenizer.h"
+#include "base/nix/xdg_util.h"
+#include "chrome/browser/browser_list.h"
+#include "chrome/browser/browser_thread.h"
+#include "chrome/browser/tab_contents/tab_contents.h"
+#include "chrome/common/process_watcher.h"
+#include "ui/base/gtk/gtk_signal.h"
+
+// Command used to configure GNOME proxy settings. The command was renamed
+// in January 2009, so both are used to work on both old and new systems.
+const char* kOldGNOMEProxyConfigCommand[] = {"gnome-network-preferences", NULL};
+const char* kGNOMEProxyConfigCommand[] = {"gnome-network-properties", NULL};
+// KDE3 and KDE4 are only slightly different, but incompatible. Go figure.
+const char* kKDE3ProxyConfigCommand[] = {"kcmshell", "proxy", NULL};
+const char* kKDE4ProxyConfigCommand[] = {"kcmshell4", "proxy", NULL};
+
+// The URL for Linux proxy configuration help when not running under a
+// supported desktop environment.
+const char kLinuxProxyConfigUrl[] = "about:linux-proxy-config";
+
+struct ProxyConfigCommand {
+ std::string binary;
+ const char** argv;
+};
+
+namespace {
+
+// Search $PATH to find one of the commands. Store the full path to
+// it in the |binary| field and the command array index in in |index|.
+bool SearchPATH(ProxyConfigCommand* commands, size_t ncommands, size_t* index) {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
+ const char* path = getenv("PATH");
+ if (!path)
+ return false;
+ FilePath bin_path;
+ CStringTokenizer tk(path, path + strlen(path), ":");
+ // Search $PATH looking for the commands in order.
+ while (tk.GetNext()) {
+ for (size_t i = 0; i < ncommands; i++) {
+ bin_path = FilePath(tk.token()).Append(commands[i].argv[0]);
+ if (file_util::PathExists(bin_path)) {
+ commands[i].binary = bin_path.value();
+ if (index)
+ *index = i;
+ return true;
+ }
+ }
+ }
+ // Did not find any of the binaries in $PATH.
+ return false;
+}
+
+// Show the proxy config URL in the given tab.
+void ShowLinuxProxyConfigUrl(TabContents* tab_contents) {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+ scoped_ptr<base::Environment> env(base::Environment::Create());
+ const char* name = base::nix::GetDesktopEnvironmentName(env.get());
+ if (name)
+ LOG(ERROR) << "Could not find " << name << " network settings in $PATH";
+ tab_contents->OpenURL(GURL(kLinuxProxyConfigUrl), GURL(),
+ NEW_FOREGROUND_TAB, PageTransition::LINK);
+}
+
+// Start the given proxy configuration utility.
+void StartProxyConfigUtil(TabContents* tab_contents,
+ const ProxyConfigCommand& command) {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
+ std::vector<std::string> argv;
+ argv.push_back(command.binary);
+ for (size_t i = 1; command.argv[i]; i++)
+ argv.push_back(command.argv[i]);
+ base::file_handle_mapping_vector no_files;
+ base::ProcessHandle handle;
+ if (!base::LaunchApp(argv, no_files, false, &handle)) {
+ LOG(ERROR) << "StartProxyConfigUtil failed to start " << command.binary;
+ BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
+ NewRunnableFunction(&ShowLinuxProxyConfigUrl, tab_contents));
+ return;
+ }
+ ProcessWatcher::EnsureProcessGetsReaped(handle);
+}
+
+// Detect, and if possible, start the appropriate proxy config utility. On
+// failure to do so, show the Linux proxy config URL in a new tab instead.
+void DetectAndStartProxyConfigUtil(TabContents* tab_contents) {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
+ scoped_ptr<base::Environment> env(base::Environment::Create());
+
+ ProxyConfigCommand command;
+ bool found_command = false;
+ switch (base::nix::GetDesktopEnvironment(env.get())) {
+ case base::nix::DESKTOP_ENVIRONMENT_GNOME: {
+ size_t index;
+ ProxyConfigCommand commands[2];
+ commands[0].argv = kGNOMEProxyConfigCommand;
+ commands[1].argv = kOldGNOMEProxyConfigCommand;
+ found_command = SearchPATH(commands, 2, &index);
+ if (found_command)
+ command = commands[index];
+ break;
+ }
+
+ case base::nix::DESKTOP_ENVIRONMENT_KDE3:
+ command.argv = kKDE3ProxyConfigCommand;
+ found_command = SearchPATH(&command, 1, NULL);
+ break;
+
+ case base::nix::DESKTOP_ENVIRONMENT_KDE4:
+ command.argv = kKDE4ProxyConfigCommand;
+ found_command = SearchPATH(&command, 1, NULL);
+ break;
+
+ case base::nix::DESKTOP_ENVIRONMENT_XFCE:
+ case base::nix::DESKTOP_ENVIRONMENT_OTHER:
+ break;
+ }
+
+ if (found_command) {
+ StartProxyConfigUtil(tab_contents, command);
+ } else {
+ BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
+ NewRunnableFunction(&ShowLinuxProxyConfigUrl, tab_contents));
+ }
+}
+
+} // anonymous namespace
+
+void AdvancedOptionsUtilities::ShowNetworkProxySettings(
+ TabContents* tab_contents) {
+ BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE,
+ NewRunnableFunction(&DetectAndStartProxyConfigUtil, tab_contents));
+}
+
+#endif // !defined(OS_CHROMEOS)