diff options
author | csilv@chromium.org <csilv@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-07-28 19:15:04 +0000 |
---|---|---|
committer | csilv@chromium.org <csilv@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-07-28 19:15:04 +0000 |
commit | 1bd625297949b2d7e8976782b825f7419d49f7f3 (patch) | |
tree | e6052261b75986650948d7a76d69ca228e1dc1e2 /chrome/browser/dom_ui | |
parent | 8e38f3b749e43228dad7878595eceb259bcc3277 (diff) | |
download | chromium_src-1bd625297949b2d7e8976782b825f7419d49f7f3.zip chromium_src-1bd625297949b2d7e8976782b825f7419d49f7f3.tar.gz chromium_src-1bd625297949b2d7e8976782b825f7419d49f7f3.tar.bz2 |
- Implement proxy settings dialog for Linux/Windows.
- Omit Network and SSL sections for ChromeOS.
BUG=49038
TEST=Exercise proxy settings dialog in dom-ui options window (--enable-tabbed-options).
Review URL: http://codereview.chromium.org/2847061
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@53990 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/dom_ui')
-rw-r--r-- | chrome/browser/dom_ui/advanced_options_handler.cc | 56 | ||||
-rw-r--r-- | chrome/browser/dom_ui/advanced_options_handler.h | 22 | ||||
-rw-r--r-- | chrome/browser/dom_ui/advanced_options_utils.h | 25 | ||||
-rw-r--r-- | chrome/browser/dom_ui/advanced_options_utils_gtk.cc | 132 | ||||
-rw-r--r-- | chrome/browser/dom_ui/advanced_options_utils_mac.h | 24 | ||||
-rw-r--r-- | chrome/browser/dom_ui/advanced_options_utils_mac.mm | 8 | ||||
-rw-r--r-- | chrome/browser/dom_ui/advanced_options_utils_win.cc | 67 |
7 files changed, 261 insertions, 73 deletions
diff --git a/chrome/browser/dom_ui/advanced_options_handler.cc b/chrome/browser/dom_ui/advanced_options_handler.cc index 6999dea..1f776dc 100644 --- a/chrome/browser/dom_ui/advanced_options_handler.cc +++ b/chrome/browser/dom_ui/advanced_options_handler.cc @@ -4,16 +4,12 @@ #include "chrome/browser/dom_ui/advanced_options_handler.h" -#if defined(OS_WIN) -#include <cryptuiapi.h> -#pragma comment(lib, "cryptui.lib") -#endif - #include "app/l10n_util.h" #include "base/basictypes.h" #include "base/callback.h" #include "base/values.h" #include "chrome/browser/download/download_manager.h" +#include "chrome/browser/metrics/user_metrics.h" #include "chrome/browser/pref_service.h" #include "chrome/browser/profile.h" #include "chrome/browser/tab_contents/tab_contents.h" @@ -25,14 +21,12 @@ #include "grit/generated_resources.h" #include "grit/locale_settings.h" -#if defined(OS_WIN) -#include "net/base/ssl_config_service_win.h" +#if !defined(OS_CHROMEOS) +#include "chrome/browser/dom_ui/advanced_options_utils.h" #endif -#if defined(OS_LINUX) || defined(OS_FREEBSD) || defined(OS_OPENBSD) -// The URL for Linux ssl certificate configuration help. -const char* const kLinuxCertificatesConfigUrl = - "http://code.google.com/p/chromium/wiki/LinuxCertManagement"; +#if defined(OS_WIN) +#include "net/base/ssl_config_service_win.h" #endif AdvancedOptionsHandler::AdvancedOptionsHandler() { @@ -157,12 +151,14 @@ void AdvancedOptionsHandler::RegisterMessages() { dom_ui_->RegisterMessageCallback("autoOpenFileTypesAction", NewCallback(this, &AdvancedOptionsHandler::HandleAutoOpenButton)); +#if !defined(OS_CHROMEOS) dom_ui_->RegisterMessageCallback("showManageSSLCertificates", NewCallback(this, &AdvancedOptionsHandler::ShowManageSSLCertificates)); dom_ui_->RegisterMessageCallback("showNetworkProxySettings", NewCallback(this, &AdvancedOptionsHandler::ShowNetworkProxySettings)); +#endif #if defined(OS_WIN) // Setup Windows specific callbacks. @@ -249,6 +245,21 @@ void AdvancedOptionsHandler::HandleUseSSL2Checkbox(const Value* value) { } #endif +#if !defined(OS_CHROMEOS) +void AdvancedOptionsHandler::ShowNetworkProxySettings(const Value* value) { + UserMetricsRecordAction(UserMetricsAction("Options_ShowProxySettings"), NULL); + DCHECK(dom_ui_); + AdvancedOptionsUtilities::ShowNetworkProxySettings(dom_ui_->tab_contents()); +} + +void AdvancedOptionsHandler::ShowManageSSLCertificates(const Value* value) { + UserMetricsRecordAction(UserMetricsAction("Options_ManageSSLCertificates"), + NULL); + DCHECK(dom_ui_); + AdvancedOptionsUtilities::ShowManageSSLCertificates(dom_ui_->tab_contents()); +} +#endif + void AdvancedOptionsHandler::SetupDownloadLocationPath() { DCHECK(dom_ui_); StringValue value(default_download_location_.GetValue().value()); @@ -286,26 +297,3 @@ void AdvancedOptionsHandler::SetupSSLConfigSettings() { L"advancedOptionsSetUseSSL2CheckboxStatechecked", useSSLValue); } #endif - -void AdvancedOptionsHandler::ShowNetworkProxySettings(const Value* value) { -#if defined(OS_MACOSX) - AdvancedOptionsUtilities::ShowNetworkProxySettings(); -#endif -} - -void AdvancedOptionsHandler::ShowManageSSLCertificates(const Value* value) { -#if defined(OS_MACOSX) - AdvancedOptionsUtilities::ShowManageSSLCertificates(); -#elif defined(OS_WIN) - DCHECK(dom_ui_); - CRYPTUI_CERT_MGR_STRUCT cert_mgr = { 0 }; - cert_mgr.dwSize = sizeof(CRYPTUI_CERT_MGR_STRUCT); - cert_mgr.hwndParent = - dom_ui_->tab_contents()->view()->GetTopLevelNativeWindow(); - ::CryptUIDlgCertMgr(&cert_mgr); -#elif defined(OS_LINUX) || defined(OS_FREEBSD) || defined(OS_OPENBSD) - DCHECK(dom_ui_); - dom_ui_->tab_contents()->OpenURL(GURL(kLinuxCertificatesConfigUrl), GURL(), - NEW_WINDOW, PageTransition::LINK); -#endif -} diff --git a/chrome/browser/dom_ui/advanced_options_handler.h b/chrome/browser/dom_ui/advanced_options_handler.h index ae7613a..44ea774 100644 --- a/chrome/browser/dom_ui/advanced_options_handler.h +++ b/chrome/browser/dom_ui/advanced_options_handler.h @@ -10,10 +10,6 @@ #include "chrome/browser/pref_member.h" #include "chrome/browser/shell_dialogs.h" -#if defined(OS_MACOSX) -#include "chrome/browser/dom_ui/advanced_options_utils_mac.h" -#endif - // Chrome advanced options page UI handler. class AdvancedOptionsHandler : public OptionsPageUIHandler, @@ -57,6 +53,16 @@ class AdvancedOptionsHandler void HandleUseSSL2Checkbox(const Value* value); #endif +#if !defined(OS_CHROMEOS) + // Callback for the "showNetworkProxySettings" message. This will invoke + // an appropriate dialog for configuring proxy settings. + void ShowNetworkProxySettings(const Value* value); + + // Callback for the "showManageSSLCertificates" message. This will invoke + // an appropriate certificate management action based on the platform. + void ShowManageSSLCertificates(const Value* value); +#endif + // Setup the download path based on user preferences. void SetupDownloadLocationPath(); @@ -68,14 +74,6 @@ class AdvancedOptionsHandler void SetupSSLConfigSettings(); #endif - // Callback for the "showNetworkProxySettings" message. This will invoke - // an appropriate dialog for configuring proxy settings. - void ShowNetworkProxySettings(const Value* value); - - // Callback for the "showManageSSLCertificates" message. This will invoke - // an appropriate certificate management action based on the platform. - void ShowManageSSLCertificates(const Value* value); - scoped_refptr<SelectFileDialog> select_folder_dialog_; FilePathPrefMember default_download_location_; StringPrefMember auto_open_files_; diff --git a/chrome/browser/dom_ui/advanced_options_utils.h b/chrome/browser/dom_ui/advanced_options_utils.h new file mode 100644 index 0000000..669fcf7 --- /dev/null +++ b/chrome/browser/dom_ui/advanced_options_utils.h @@ -0,0 +1,25 @@ +// Copyright (c) 2010 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. + +#ifndef CHROME_BROWSER_DOM_UI_ADVANCED_OPTIONS_UTILS_H_ +#define CHROME_BROWSER_DOM_UI_ADVANCED_OPTIONS_UTILS_H_ + +#include "base/basictypes.h" + +class TabContents; + +// Chrome advanced options utility methods. +class AdvancedOptionsUtilities { + public: + // Invoke UI for network proxy settings. + static void ShowNetworkProxySettings(TabContents*); + + // Invoke UI for SSL certificates. + static void ShowManageSSLCertificates(TabContents*); + + private: + DISALLOW_IMPLICIT_CONSTRUCTORS(AdvancedOptionsUtilities); +}; + +#endif // CHROME_BROWSER_DOM_UI_ADVANCED_OPTIONS_UTILS_H_ diff --git a/chrome/browser/dom_ui/advanced_options_utils_gtk.cc b/chrome/browser/dom_ui/advanced_options_utils_gtk.cc new file mode 100644 index 0000000..6cbf8d6 --- /dev/null +++ b/chrome/browser/dom_ui/advanced_options_utils_gtk.cc @@ -0,0 +1,132 @@ +// Copyright (c) 2010 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/advanced_options_utils.h" + +#include "app/gtk_signal.h" +#include "app/gtk_util.h" +#include "base/file_util.h" +#include "base/env_var.h" +#include "base/process_util.h" +#include "base/string_tokenizer.h" +#include "base/xdg_util.h" +#include "chrome/browser/browser_list.h" +#include "chrome/browser/tab_contents/tab_contents.h" +#include "chrome/common/process_watcher.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"; + +// The URL for Linux ssl certificate configuration help. +const char* const kLinuxCertificatesConfigUrl = + "http://code.google.com/p/chromium/wiki/LinuxCertManagement"; + + +struct ProxyConfigCommand { + std::string binary; + const char** argv; +}; + +static bool SearchPATH(ProxyConfigCommand* commands, size_t ncommands, + size_t* index) { + 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; +} + +static void StartProxyConfigUtil(const ProxyConfigCommand& command) { + 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; + BrowserList::GetLastActive()-> + OpenURL(GURL(kLinuxProxyConfigUrl), GURL(), NEW_FOREGROUND_TAB, + PageTransition::LINK); + return; + } + ProcessWatcher::EnsureProcessGetsReaped(handle); +} + +void AdvancedOptionsUtilities::ShowNetworkProxySettings( + TabContents* tab_contents) { + scoped_ptr<base::EnvVarGetter> env_getter(base::EnvVarGetter::Create()); + + ProxyConfigCommand command; + bool found_command = false; + switch (base::GetDesktopEnvironment(env_getter.get())) { + case base::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::DESKTOP_ENVIRONMENT_KDE3: + command.argv = kKDE3ProxyConfigCommand; + found_command = SearchPATH(&command, 1, NULL); + break; + + case base::DESKTOP_ENVIRONMENT_KDE4: + command.argv = kKDE4ProxyConfigCommand; + found_command = SearchPATH(&command, 1, NULL); + break; + + case base::DESKTOP_ENVIRONMENT_XFCE: + case base::DESKTOP_ENVIRONMENT_OTHER: + break; + } + + if (found_command) { + StartProxyConfigUtil(command); + } else { + const char* name = base::GetDesktopEnvironmentName(env_getter.get()); + if (name) + LOG(ERROR) << "Could not find " << name << " network settings in $PATH"; + tab_contents->OpenURL(GURL(kLinuxProxyConfigUrl), GURL(), + NEW_FOREGROUND_TAB, PageTransition::LINK); + } +} + +void AdvancedOptionsUtilities::ShowManageSSLCertificates( + TabContents* tab_contents) { + tab_contents->OpenURL(GURL(kLinuxCertificatesConfigUrl), GURL(), + NEW_WINDOW, PageTransition::LINK); +} + +#endif // !defined(OS_CHROMEOS) diff --git a/chrome/browser/dom_ui/advanced_options_utils_mac.h b/chrome/browser/dom_ui/advanced_options_utils_mac.h deleted file mode 100644 index eb64de0..0000000 --- a/chrome/browser/dom_ui/advanced_options_utils_mac.h +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright (c) 2010 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. - -#ifndef CHROME_BROWSER_DOM_UI_ADVANCED_OPTIONS_UTILS_MAC_H_ -#define CHROME_BROWSER_DOM_UI_ADVANCED_OPTIONS_UTILS_MAC_H_ -#pragma once - -#include "base/basictypes.h" - -// Chrome advanced options utility methods for Mac OS X. -class AdvancedOptionsUtilities { - public: - // Invoke the Mac OS X Network panel for configuring proxy settings. - static void ShowNetworkProxySettings(); - - // Invoke the Mac OS X Keychain application for inspecting certificates. - static void ShowManageSSLCertificates(); - - private: - DISALLOW_IMPLICIT_CONSTRUCTORS(AdvancedOptionsUtilities); -}; - -#endif // CHROME_BROWSER_DOM_UI_ADVANCED_OPTIONS_UTILS_MAC_H_ diff --git a/chrome/browser/dom_ui/advanced_options_utils_mac.mm b/chrome/browser/dom_ui/advanced_options_utils_mac.mm index c4784f0..51bede2 100644 --- a/chrome/browser/dom_ui/advanced_options_utils_mac.mm +++ b/chrome/browser/dom_ui/advanced_options_utils_mac.mm @@ -4,10 +4,11 @@ #import <Cocoa/Cocoa.h> -#include "chrome/browser/dom_ui/advanced_options_utils_mac.h" +#include "chrome/browser/dom_ui/advanced_options_utils.h" #include "base/logging.h" -void AdvancedOptionsUtilities::ShowNetworkProxySettings() { +void AdvancedOptionsUtilities::ShowNetworkProxySettings( + TabContents* tab_contents) { NSArray* itemsToOpen = [NSArray arrayWithObject:[NSURL fileURLWithPath: @"/System/Library/PreferencePanes/Network.prefPane"]]; @@ -29,7 +30,8 @@ void AdvancedOptionsUtilities::ShowNetworkProxySettings() { AEDisposeDesc(&openParams); } -void AdvancedOptionsUtilities::ShowManageSSLCertificates() { +void AdvancedOptionsUtilities::ShowManageSSLCertificates( + TabContents* tab_contents) { NSString* const kKeychainBundleId = @"com.apple.keychainaccess"; [[NSWorkspace sharedWorkspace] launchAppWithBundleIdentifier:kKeychainBundleId diff --git a/chrome/browser/dom_ui/advanced_options_utils_win.cc b/chrome/browser/dom_ui/advanced_options_utils_win.cc new file mode 100644 index 0000000..cbff7d3 --- /dev/null +++ b/chrome/browser/dom_ui/advanced_options_utils_win.cc @@ -0,0 +1,67 @@ +// Copyright (c) 2010 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. + +#include "chrome/browser/dom_ui/advanced_options_utils.h" + +#include <windows.h> +#include <cryptuiapi.h> +#pragma comment(lib, "cryptui.lib") +#include <shellapi.h> + +#include "base/file_util.h" +#include "base/path_service.h" +#include "base/thread.h" +#include "chrome/browser/browser_process.h" +#include "chrome/browser/tab_contents/tab_contents.h" +#include "chrome/browser/tab_contents/tab_contents_view.h" + +// A helper method that opens the Internet Options control panel dialog with +// the Connections tab selected. +class OpenConnectionDialogTask : public Task { + public: + OpenConnectionDialogTask() {} + + virtual void Run() { + // Using rundll32 seems better than LaunchConnectionDialog which causes a + // new dialog to be made for each call. rundll32 uses the same global + // dialog and it seems to share with the shortcut in control panel. + FilePath rundll32; + PathService::Get(base::DIR_SYSTEM, &rundll32); + rundll32 = rundll32.AppendASCII("rundll32.exe"); + + FilePath shell32dll; + PathService::Get(base::DIR_SYSTEM, &shell32dll); + shell32dll = shell32dll.AppendASCII("shell32.dll"); + + FilePath inetcpl; + PathService::Get(base::DIR_SYSTEM, &inetcpl); + inetcpl = inetcpl.AppendASCII("inetcpl.cpl,,4"); + + std::wstring args(shell32dll.value()); + args.append(L",Control_RunDLL "); + args.append(inetcpl.value()); + + ShellExecute(NULL, L"open", rundll32.value().c_str(), args.c_str(), NULL, + SW_SHOWNORMAL); + } + + private: + DISALLOW_COPY_AND_ASSIGN(OpenConnectionDialogTask); +}; + +void AdvancedOptionsUtilities::ShowNetworkProxySettings( + TabContents* tab_contents) { + base::Thread* thread = g_browser_process->file_thread(); + DCHECK(thread); + thread->message_loop()->PostTask(FROM_HERE, new OpenConnectionDialogTask); +} + +void AdvancedOptionsUtilities::ShowManageSSLCertificates( + TabContents* tab_contents) { + CRYPTUI_CERT_MGR_STRUCT cert_mgr = { 0 }; + cert_mgr.dwSize = sizeof(CRYPTUI_CERT_MGR_STRUCT); + cert_mgr.hwndParent = + tab_contents->view()->GetTopLevelNativeWindow(); + ::CryptUIDlgCertMgr(&cert_mgr); +} |