diff options
author | tfarina@chromium.org <tfarina@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-02-19 14:12:23 +0000 |
---|---|---|
committer | tfarina@chromium.org <tfarina@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-02-19 14:12:23 +0000 |
commit | 1ab7761d57f2144fac3f03958e571410b595a2b9 (patch) | |
tree | b955a9d1e73f56d953339e852a7402faf9141a09 /chrome/browser/webui/options/advanced_options_utils_gtk.cc | |
parent | c1338959f5d9fa970750a3007c52f3151b877232 (diff) | |
download | chromium_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.cc | 145 |
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) |