summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormattm@chromium.org <mattm@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-07-17 23:28:08 +0000
committermattm@chromium.org <mattm@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-07-17 23:28:08 +0000
commit425be73ff46ed6961322f7f412a2d403b371fc69 (patch)
tree5b2148b4d77238cefbef409b3390e120144ec0d3
parent85b893f08d534d5146d94de1863a4e0ac0cbf75c (diff)
downloadchromium_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.cc10
-rw-r--r--base/linux_util.h6
-rw-r--r--chrome/app/resources/locale_settings.grd6
-rw-r--r--chrome/browser/gtk/options/advanced_contents_gtk.cc52
-rw-r--r--net/proxy/proxy_config_service_linux.cc9
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(