diff options
author | mattm@chromium.org <mattm@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-07-17 23:28:08 +0000 |
---|---|---|
committer | mattm@chromium.org <mattm@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-07-17 23:28:08 +0000 |
commit | 425be73ff46ed6961322f7f412a2d403b371fc69 (patch) | |
tree | 5b2148b4d77238cefbef409b3390e120144ec0d3 | |
parent | 85b893f08d534d5146d94de1863a4e0ac0cbf75c (diff) | |
download | chromium_src-425be73ff46ed6961322f7f412a2d403b371fc69.zip chromium_src-425be73ff46ed6961322f7f412a2d403b371fc69.tar.gz chromium_src-425be73ff46ed6961322f7f412a2d403b371fc69.tar.bz2 |
Add proxy config (using gnome-network-preferences)
BUG=11507
TEST=Open options, click change proxy, gnome-network-preferences should launch. If gnome isn't installed, LinuxProxyConfig wiki page should load.
Review URL: http://codereview.chromium.org/149785
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@21023 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | base/linux_util.cc | 10 | ||||
-rw-r--r-- | base/linux_util.h | 6 | ||||
-rw-r--r-- | chrome/app/resources/locale_settings.grd | 6 | ||||
-rw-r--r-- | chrome/browser/gtk/options/advanced_contents_gtk.cc | 52 | ||||
-rw-r--r-- | net/proxy/proxy_config_service_linux.cc | 9 |
5 files changed, 75 insertions, 8 deletions
diff --git a/base/linux_util.cc b/base/linux_util.cc index 604980b..d8b36ed 100644 --- a/base/linux_util.cc +++ b/base/linux_util.cc @@ -59,4 +59,14 @@ std::string GetLinuxDistro() { return linux_distro; } +bool UseGnomeForSettings() { + // GNOME_DESKTOP_SESSION_ID being defined is a good indication that + // we are probably running under GNOME. + // Note: KDE_FULL_SESSION is a corresponding env var to recognize KDE. + char* desktop_session; + return (getenv("GNOME_DESKTOP_SESSION_ID") || + ((desktop_session = getenv("DESKTOP_SESSION")) && + std::string(desktop_session) == "gnome")); +} + } // namespace base diff --git a/base/linux_util.h b/base/linux_util.h index 973a2b0..75b4ad4 100644 --- a/base/linux_util.h +++ b/base/linux_util.h @@ -20,6 +20,12 @@ uint8_t* BGRAToRGBA(const uint8_t* pixels, int width, int height, int stride); // GetWinVersion() in base/win_util.h. std::string GetLinuxDistro(); +// Return true if we appear to be running under Gnome and should attempt to use +// some prefrences from the desktop environment (eg proxy settings), +// If someone adds support for other environments, this function could be +// replaced with one that returns an enum so we an specify Gnome, KDE, etc. +bool UseGnomeForSettings(); + } // namespace base #endif // BASE_LINUX_UTIL_H__ diff --git a/chrome/app/resources/locale_settings.grd b/chrome/app/resources/locale_settings.grd index 857bfde..aeb4c52 100644 --- a/chrome/app/resources/locale_settings.grd +++ b/chrome/app/resources/locale_settings.grd @@ -543,6 +543,12 @@ <message name="IDS_CHROMIUM_PROJECT_URL" translateable="false"> http://code.google.com/chromium/?hl=[GRITLANGCODE] </message> + + <!-- The URL for Linux proxy configuration help when not running under --> + <!-- a supported desktop environment. --> + <message name="IDS_LINUX_PROXY_CONFIG_URL" translateable="false"> + http://code.google.com/p/chromium/wiki/LinuxProxyConfig + </message> </messages> </release> </grit> diff --git a/chrome/browser/gtk/options/advanced_contents_gtk.cc b/chrome/browser/gtk/options/advanced_contents_gtk.cc index 89c4d18..4dc0460 100644 --- a/chrome/browser/gtk/options/advanced_contents_gtk.cc +++ b/chrome/browser/gtk/options/advanced_contents_gtk.cc @@ -4,9 +4,14 @@ #include "chrome/browser/gtk/options/advanced_contents_gtk.h" +#include <sys/types.h> +#include <sys/wait.h> + #include "app/l10n_util.h" #include "base/basictypes.h" +#include "base/linux_util.h" #include "base/path_service.h" +#include "base/process_util.h" #include "chrome/browser/browser_list.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/download/download_manager.h" @@ -29,6 +34,9 @@ namespace { +// Command used to configure the gconf proxy settings. +const char kProxyConfigBinary[] = "gnome-network-preferences"; + // The pixel width we wrap labels at. // TODO(evanm): make the labels wrap at the appropriate width. const int kWrapWidth = 475; @@ -250,6 +258,10 @@ class NetworkSection : public OptionsPageBase { } private: + // The callback functions for invoking the proxy config dialog. + static void OnChangeProxiesButtonClicked(GtkButton *button, + NetworkSection* section); + // The widget containing the options for this section. GtkWidget* page_; @@ -259,10 +271,48 @@ class NetworkSection : public OptionsPageBase { NetworkSection::NetworkSection(Profile* profile) : OptionsPageBase(profile) { page_ = gtk_vbox_new(FALSE, gtk_util::kControlSpacing); - gtk_box_pack_start(GTK_BOX(page_), gtk_label_new("TODO network options"), + + GtkWidget* proxy_description_label = CreateWrappedLabel( + IDS_OPTIONS_PROXIES_LABEL); + gtk_misc_set_alignment(GTK_MISC(proxy_description_label), 0, 0); + gtk_box_pack_start(GTK_BOX(page_), proxy_description_label, + FALSE, FALSE, 0); + + GtkWidget* change_proxies_button = gtk_button_new_with_label( + l10n_util::GetStringUTF8( + IDS_OPTIONS_PROXIES_CONFIGURE_BUTTON).c_str()); + g_signal_connect(change_proxies_button, "clicked", + G_CALLBACK(OnChangeProxiesButtonClicked), this); + // Stick it in an hbox so it doesn't expand to the whole width. + GtkWidget* button_hbox = gtk_hbox_new(FALSE, 0); + gtk_box_pack_start(GTK_BOX(button_hbox), + change_proxies_button, FALSE, FALSE, 0); + gtk_box_pack_start(GTK_BOX(page_), + OptionsLayoutBuilderGtk::IndentWidget(button_hbox), + FALSE, FALSE, 0); +} + +// static +void NetworkSection::OnChangeProxiesButtonClicked(GtkButton *button, + NetworkSection* section) { + section->UserMetricsRecordAction(L"Options_ChangeProxies", NULL); + + if (base::UseGnomeForSettings()) { + std::vector<std::string> argv; + argv.push_back(kProxyConfigBinary); + if (!base::LaunchApp(CommandLine(argv), false, false, NULL)) { + LOG(ERROR) << "OpenProxyConfigDialogTask failed"; + return; + } + } else { + BrowserList::GetLastActive()-> + OpenURL(GURL(l10n_util::GetStringUTF8(IDS_LINUX_PROXY_CONFIG_URL)), + GURL(), NEW_FOREGROUND_TAB, PageTransition::LINK); + } } + /////////////////////////////////////////////////////////////////////////////// // PrivacySection diff --git a/net/proxy/proxy_config_service_linux.cc b/net/proxy/proxy_config_service_linux.cc index f85e450..eef6d97 100644 --- a/net/proxy/proxy_config_service_linux.cc +++ b/net/proxy/proxy_config_service_linux.cc @@ -7,6 +7,7 @@ #include <gconf/gconf-client.h> #include <stdlib.h> +#include "base/linux_util.h" #include "base/logging.h" #include "base/string_tokenizer.h" #include "base/string_util.h" @@ -535,13 +536,6 @@ ProxyConfigServiceLinux::Delegate::Delegate( } bool ProxyConfigServiceLinux::Delegate::ShouldTryGConf() { - // GNOME_DESKTOP_SESSION_ID being defined is a good indication that - // we are probably running under GNOME. - // Note: KDE_FULL_SESSION is a corresponding env var to recognize KDE. - std::string dummy, desktop_session; - return env_var_getter_->Getenv("GNOME_DESKTOP_SESSION_ID", &dummy) - || (env_var_getter_->Getenv("DESKTOP_SESSION", &desktop_session) - && desktop_session == "gnome"); // I (sdoyon) would have liked to prioritize environment variables // and only fallback to gconf if env vars were unset. But // gnome-terminal "helpfully" sets http_proxy and no_proxy, and it @@ -549,6 +543,7 @@ bool ProxyConfigServiceLinux::Delegate::ShouldTryGConf() { // mislead us. // // We could introduce a CHROME_PROXY_OBEY_ENV_VARS variable...?? + return base::UseGnomeForSettings(); } void ProxyConfigServiceLinux::Delegate::SetupAndFetchInitialConfig( |