summaryrefslogtreecommitdiffstats
path: root/chrome
diff options
context:
space:
mode:
authormnissler@chromium.org <mnissler@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-07-23 10:57:36 +0000
committermnissler@chromium.org <mnissler@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-07-23 10:57:36 +0000
commit9a4a34ac02f7317286b5edde3ce98ec9cb35deb5 (patch)
treee6c5bc0a74c2708e703cc6edf086dc4d3bf5d467 /chrome
parent5b7a0cfbc0c936545c214e681df783cb7bd81222 (diff)
downloadchromium_src-9a4a34ac02f7317286b5edde3ce98ec9cb35deb5.zip
chromium_src-9a4a34ac02f7317286b5edde3ce98ec9cb35deb5.tar.gz
chromium_src-9a4a34ac02f7317286b5edde3ce98ec9cb35deb5.tar.bz2
Disable proxy config button and show banner if proxy prefs are managed.
Preferences.xib changes: Connect Enabled of the proxies configuration button to a getter in PreferencesWindowController. BUG=49538 TEST=Unit test in pref_set_observer_unittest.cc, manually configure proxy policies, check advanced options page. Review URL: http://codereview.chromium.org/3038013 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@53457 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome')
-rw-r--r--chrome/app/nibs/Preferences.xib16
-rw-r--r--chrome/browser/cocoa/preferences_window_controller.h4
-rw-r--r--chrome/browser/cocoa/preferences_window_controller.mm10
-rw-r--r--chrome/browser/gtk/options/advanced_contents_gtk.cc26
-rw-r--r--chrome/browser/managed_prefs_banner_base.cc5
-rw-r--r--chrome/browser/pref_set_observer.cc66
-rw-r--r--chrome/browser/pref_set_observer.h53
-rw-r--r--chrome/browser/pref_set_observer_unittest.cc88
-rw-r--r--chrome/browser/views/options/advanced_contents_view.cc11
-rw-r--r--chrome/chrome_browser.gypi2
-rw-r--r--chrome/chrome_tests.gypi3
11 files changed, 280 insertions, 4 deletions
diff --git a/chrome/app/nibs/Preferences.xib b/chrome/app/nibs/Preferences.xib
index 79e9daf..9ceed27 100644
--- a/chrome/app/nibs/Preferences.xib
+++ b/chrome/app/nibs/Preferences.xib
@@ -3824,6 +3824,22 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA</bytes>
</object>
<int key="connectionID">714</int>
</object>
+ <object class="IBConnectionRecord">
+ <object class="IBBindingConnection" key="connection">
+ <string key="label">enabled: proxiesConfigureButtonEnabled</string>
+ <reference key="source" ref="383918134"/>
+ <reference key="destination" ref="1001"/>
+ <object class="NSNibBindingConnector" key="connector">
+ <reference key="NSSource" ref="383918134"/>
+ <reference key="NSDestination" ref="1001"/>
+ <string key="NSLabel">enabled: proxiesConfigureButtonEnabled</string>
+ <string key="NSBinding">enabled</string>
+ <string key="NSKeyPath">proxiesConfigureButtonEnabled</string>
+ <int key="NSNibBindingConnectorVersion">2</int>
+ </object>
+ </object>
+ <int key="connectionID">717</int>
+ </object>
</object>
<object class="IBMutableOrderedSet" key="objectRecords">
<object class="NSArray" key="orderedObjects">
diff --git a/chrome/browser/cocoa/preferences_window_controller.h b/chrome/browser/cocoa/preferences_window_controller.h
index 707f597..ffb6c1c 100644
--- a/chrome/browser/cocoa/preferences_window_controller.h
+++ b/chrome/browser/cocoa/preferences_window_controller.h
@@ -8,6 +8,7 @@
#include "base/scoped_nsobject.h"
#include "chrome/browser/options_window.h"
#include "chrome/browser/pref_member.h"
+#include "chrome/browser/pref_set_observer.h"
namespace PreferencesWindowControllerInternal {
class PrefObserverBridge;
@@ -123,6 +124,8 @@ class ProfileSyncService;
FontLanguageSettingsController* fontLanguageSettings_;
StringPrefMember currentTheme_;
IBOutlet NSButton* enableLoggingCheckbox_;
+ scoped_ptr<PrefSetObserver> proxyPrefs_;
+ BOOL proxiesConfigureButtonEnabled_;
}
// Designated initializer. |profile| should not be NULL.
@@ -170,6 +173,7 @@ class ProfileSyncService;
// Usable from cocoa bindings to hook up the custom home pages table.
@property (nonatomic, readonly) CustomHomePagesModel* customPagesSource;
+@property (assign, nonatomic) BOOL proxiesConfigureButtonEnabled;
@end
diff --git a/chrome/browser/cocoa/preferences_window_controller.mm b/chrome/browser/cocoa/preferences_window_controller.mm
index 0aa1501..d7ec2de 100644
--- a/chrome/browser/cocoa/preferences_window_controller.mm
+++ b/chrome/browser/cocoa/preferences_window_controller.mm
@@ -416,6 +416,8 @@ class ManagedPrefsBannerState : public ManagedPrefsBannerBase {
@implementation PreferencesWindowController
+@synthesize proxiesConfigureButtonEnabled = proxiesConfigureButtonEnabled_;
+
- (id)initWithProfile:(Profile*)profile initialPage:(OptionsPage)initialPage {
DCHECK(profile);
// Use initWithWindowNibPath:: instead of initWithWindowNibName: so we
@@ -483,6 +485,11 @@ class ManagedPrefsBannerState : public ManagedPrefsBannerBase {
PersonalDataManager* personalDataManager =
profile_->GetPersonalDataManager();
[autoFillSettingsButton_ setHidden:(personalDataManager == NULL)];
+
+ // Initialize the proxy pref set observer.
+ proxyPrefs_.reset(
+ PrefSetObserver::CreateProxyPrefSetObserver(prefs_, observer_.get()));
+ [self setProxiesConfigureButtonEnabled:!proxyPrefs_->IsManaged()];
}
return self;
}
@@ -1380,6 +1387,9 @@ const int kDisabledIndex = 1;
// Poke KVC.
[self setFileHandlerUIEnabled:[self fileHandlerUIEnabled]];
}
+ else if (proxyPrefs_->IsObserved(*prefName)) {
+ [self setProxiesConfigureButtonEnabled:!proxyPrefs_->IsManaged()];
+ }
}
// Set the new download path and notify the UI via KVO.
diff --git a/chrome/browser/gtk/options/advanced_contents_gtk.cc b/chrome/browser/gtk/options/advanced_contents_gtk.cc
index 6d06209..1c12391 100644
--- a/chrome/browser/gtk/options/advanced_contents_gtk.cc
+++ b/chrome/browser/gtk/options/advanced_contents_gtk.cc
@@ -34,6 +34,7 @@
#include "chrome/browser/options_page_base.h"
#include "chrome/browser/options_util.h"
#include "chrome/browser/pref_member.h"
+#include "chrome/browser/pref_set_observer.h"
#include "chrome/browser/profile.h"
#include "chrome/browser/renderer_host/resource_dispatcher_host.h"
#include "chrome/browser/safe_browsing/safe_browsing_service.h"
@@ -349,6 +350,9 @@ class NetworkSection : public OptionsPageBase {
}
private:
+ // Overridden from OptionsPageBase.
+ virtual void NotifyPrefChanged(const std::wstring* pref_name);
+
struct ProxyConfigCommand {
std::string binary;
const char** argv;
@@ -363,9 +367,15 @@ class NetworkSection : public OptionsPageBase {
// Start the given proxy configuration utility.
static void StartProxyConfigUtil(const ProxyConfigCommand& command);
+ // Tracks the state of proxy preferences.
+ scoped_ptr<PrefSetObserver> proxy_prefs_;
+
// The widget containing the options for this section.
GtkWidget* page_;
+ // The proxy configuration button.
+ GtkWidget* change_proxies_button_;
+
DISALLOW_COPY_AND_ASSIGN(NetworkSection);
};
@@ -379,20 +389,30 @@ NetworkSection::NetworkSection(Profile* profile)
gtk_box_pack_start(GTK_BOX(page_), proxy_description_label,
FALSE, FALSE, 0);
- GtkWidget* change_proxies_button = gtk_button_new_with_label(
+ 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_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,
+ change_proxies_button_,
FALSE, FALSE, 0);
gtk_box_pack_start(GTK_BOX(page_),
gtk_util::IndentWidget(button_hbox),
FALSE, FALSE, 0);
+
+ proxy_prefs_.reset(PrefSetObserver::CreateProxyPrefSetObserver(
+ profile->GetPrefs(), this));
+ NotifyPrefChanged(NULL);
+}
+
+void NetworkSection::NotifyPrefChanged(const std::wstring* pref_name) {
+ if (!pref_name || proxy_prefs_->IsObserved(*pref_name))
+ gtk_widget_set_sensitive(change_proxies_button_,
+ !proxy_prefs_->IsManaged());
}
// static
diff --git a/chrome/browser/managed_prefs_banner_base.cc b/chrome/browser/managed_prefs_banner_base.cc
index 225db8d..28c6b46 100644
--- a/chrome/browser/managed_prefs_banner_base.cc
+++ b/chrome/browser/managed_prefs_banner_base.cc
@@ -30,6 +30,11 @@ ManagedPrefsBannerBase::ManagedPrefsBannerBase(PrefService* prefs,
#if defined(GOOGLE_CHROME_BUILD)
AddPref(prefs::kMetricsReportingEnabled);
#endif
+ AddPref(prefs::kNoProxyServer);
+ AddPref(prefs::kProxyAutoDetect);
+ AddPref(prefs::kProxyServer);
+ AddPref(prefs::kProxyPacUrl);
+ AddPref(prefs::kProxyBypassList);
break;
default:
NOTREACHED();
diff --git a/chrome/browser/pref_set_observer.cc b/chrome/browser/pref_set_observer.cc
new file mode 100644
index 0000000..1e9f904
--- /dev/null
+++ b/chrome/browser/pref_set_observer.cc
@@ -0,0 +1,66 @@
+// 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/pref_set_observer.h"
+
+#include "chrome/common/notification_type.h"
+#include "chrome/common/pref_names.h"
+
+PrefSetObserver::PrefSetObserver(PrefService* pref_service,
+ NotificationObserver* observer)
+ : pref_service_(pref_service),
+ observer_(observer) {
+}
+
+PrefSetObserver::~PrefSetObserver() {
+ for (PrefSet::const_iterator i(prefs_.begin()); i != prefs_.end(); ++i)
+ pref_service_->RemovePrefObserver(i->c_str(), this);
+}
+
+void PrefSetObserver::AddPref(const std::wstring& pref) {
+ if (!prefs_.count(pref) && pref_service_->FindPreference(pref.c_str())) {
+ prefs_.insert(pref);
+ pref_service_->AddPrefObserver(pref.c_str(), this);
+ }
+}
+
+void PrefSetObserver::RemovePref(const std::wstring& pref) {
+ if (prefs_.erase(pref))
+ pref_service_->RemovePrefObserver(pref.c_str(), this);
+}
+
+bool PrefSetObserver::IsObserved(const std::wstring& pref) {
+ return prefs_.count(pref) > 0;
+}
+
+bool PrefSetObserver::IsManaged() {
+ for (PrefSet::const_iterator i(prefs_.begin()); i != prefs_.end(); ++i) {
+ const PrefService::Preference* pref =
+ pref_service_->FindPreference(i->c_str());
+ if (pref && pref->IsManaged())
+ return true;
+ }
+ return false;
+}
+
+// static
+PrefSetObserver* PrefSetObserver::CreateProxyPrefSetObserver(
+ PrefService* pref_service,
+ NotificationObserver* observer) {
+ PrefSetObserver* pref_set = new PrefSetObserver(pref_service, observer);
+ pref_set->AddPref(prefs::kNoProxyServer);
+ pref_set->AddPref(prefs::kProxyAutoDetect);
+ pref_set->AddPref(prefs::kProxyServer);
+ pref_set->AddPref(prefs::kProxyPacUrl);
+ pref_set->AddPref(prefs::kProxyBypassList);
+
+ return pref_set;
+}
+
+void PrefSetObserver::Observe(NotificationType type,
+ const NotificationSource& source,
+ const NotificationDetails& details) {
+ if (observer_)
+ observer_->Observe(type, source, details);
+}
diff --git a/chrome/browser/pref_set_observer.h b/chrome/browser/pref_set_observer.h
new file mode 100644
index 0000000..47c947b
--- /dev/null
+++ b/chrome/browser/pref_set_observer.h
@@ -0,0 +1,53 @@
+// 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_PREF_SET_OBSERVER_H_
+#define CHROME_BROWSER_PREF_SET_OBSERVER_H_
+
+#include <set>
+
+#include "base/basictypes.h"
+#include "chrome/browser/pref_service.h"
+#include "chrome/common/notification_observer.h"
+
+// Observes the state of a set of preferences and allows to query their combined
+// managed bits.
+class PrefSetObserver : public NotificationObserver {
+ public:
+ // Initialize with an empty set of preferences.
+ PrefSetObserver(PrefService* pref_service,
+ NotificationObserver* observer);
+ virtual ~PrefSetObserver();
+
+ // Add a |pref| to the set of preferences to observe.
+ void AddPref(const std::wstring& pref);
+ // Remove |pref| from the set of observed peferences.
+ void RemovePref(const std::wstring& pref);
+
+ // Check whether |pref| is in the set of observed preferences.
+ bool IsObserved(const std::wstring& pref);
+ // Check whether any of the observed preferences has the managed bit set.
+ bool IsManaged();
+
+ // Create a pref set observer for all preferences relavant to proxies.
+ static PrefSetObserver* CreateProxyPrefSetObserver(
+ PrefService* pref_service,
+ NotificationObserver* observer);
+
+ private:
+ // Overridden from NotificationObserver.
+ virtual void Observe(NotificationType type,
+ const NotificationSource& source,
+ const NotificationDetails& details);
+
+ typedef std::set<std::wstring> PrefSet;
+ PrefSet prefs_;
+
+ PrefService* pref_service_;
+ NotificationObserver* observer_;
+
+ DISALLOW_COPY_AND_ASSIGN(PrefSetObserver);
+};
+
+#endif // CHROME_BROWSER_PREF_SET_OBSERVER_H_
diff --git a/chrome/browser/pref_set_observer_unittest.cc b/chrome/browser/pref_set_observer_unittest.cc
new file mode 100644
index 0000000..ddb4d54
--- /dev/null
+++ b/chrome/browser/pref_set_observer_unittest.cc
@@ -0,0 +1,88 @@
+// 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/pref_set_observer.h"
+#include "chrome/common/notification_observer_mock.h"
+#include "chrome/common/pref_names.h"
+#include "chrome/test/testing_pref_service.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+// Unit tests for PrefSetObserver.
+class PrefSetObserverTest : public testing::Test {
+ public:
+ virtual void SetUp() {
+ pref_service_.reset(new TestingPrefService);
+ pref_service_->RegisterStringPref(prefs::kHomePage, "http://google.com");
+ pref_service_->RegisterBooleanPref(prefs::kHomePageIsNewTabPage, false);
+ pref_service_->RegisterStringPref(prefs::kApplicationLocale, "");
+ }
+
+ PrefSetObserver* CreatePrefSetObserver(NotificationObserver* observer) {
+ PrefSetObserver* pref_set =
+ new PrefSetObserver(pref_service_.get(), observer);
+ pref_set->AddPref(prefs::kHomePage);
+ pref_set->AddPref(prefs::kHomePageIsNewTabPage);
+ return pref_set;
+ }
+
+ scoped_ptr<TestingPrefService> pref_service_;
+};
+
+TEST_F(PrefSetObserverTest, IsObserved) {
+ scoped_ptr<PrefSetObserver> pref_set(CreatePrefSetObserver(NULL));
+ EXPECT_TRUE(pref_set->IsObserved(prefs::kHomePage));
+ EXPECT_TRUE(pref_set->IsObserved(prefs::kHomePageIsNewTabPage));
+ EXPECT_FALSE(pref_set->IsObserved(prefs::kApplicationLocale));
+}
+
+TEST_F(PrefSetObserverTest, IsManaged) {
+ scoped_ptr<PrefSetObserver> pref_set(CreatePrefSetObserver(NULL));
+ EXPECT_FALSE(pref_set->IsManaged());
+ pref_service_->SetManagedPref(prefs::kHomePage,
+ Value::CreateStringValue("http://crbug.com"));
+ EXPECT_TRUE(pref_set->IsManaged());
+ pref_service_->SetManagedPref(prefs::kHomePageIsNewTabPage,
+ Value::CreateBooleanValue(true));
+ EXPECT_TRUE(pref_set->IsManaged());
+ pref_service_->RemoveManagedPref(prefs::kHomePage);
+ EXPECT_TRUE(pref_set->IsManaged());
+ pref_service_->RemoveManagedPref(prefs::kHomePageIsNewTabPage);
+ EXPECT_FALSE(pref_set->IsManaged());
+}
+
+MATCHER_P(PrefNameDetails, name, "details references named preference") {
+ std::wstring* pstr =
+ reinterpret_cast<const Details<std::wstring>&>(arg).ptr();
+ return pstr && *pstr == name;
+}
+
+TEST_F(PrefSetObserverTest, Observe) {
+ using testing::_;
+ using testing::Mock;
+
+ NotificationObserverMock observer;
+ scoped_ptr<PrefSetObserver> pref_set(CreatePrefSetObserver(&observer));
+
+ EXPECT_CALL(observer,
+ Observe(NotificationType(NotificationType::PREF_CHANGED),
+ Source<PrefService>(pref_service_.get()),
+ PrefNameDetails(prefs::kHomePage)));
+ pref_service_->SetUserPref(prefs::kHomePage,
+ Value::CreateStringValue("http://crbug.com"));
+ Mock::VerifyAndClearExpectations(&observer);
+
+ EXPECT_CALL(observer,
+ Observe(NotificationType(NotificationType::PREF_CHANGED),
+ Source<PrefService>(pref_service_.get()),
+ PrefNameDetails(prefs::kHomePageIsNewTabPage)));
+ pref_service_->SetUserPref(prefs::kHomePageIsNewTabPage,
+ Value::CreateBooleanValue(true));
+ Mock::VerifyAndClearExpectations(&observer);
+
+ EXPECT_CALL(observer, Observe(_, _, _)).Times(0);
+ pref_service_->SetUserPref(prefs::kApplicationLocale,
+ Value::CreateStringValue("en_US.utf8"));
+ Mock::VerifyAndClearExpectations(&observer);
+}
diff --git a/chrome/browser/views/options/advanced_contents_view.cc b/chrome/browser/views/options/advanced_contents_view.cc
index bbe232f..dc95e92 100644
--- a/chrome/browser/views/options/advanced_contents_view.cc
+++ b/chrome/browser/views/options/advanced_contents_view.cc
@@ -29,6 +29,7 @@
#include "chrome/browser/options_util.h"
#include "chrome/browser/pref_member.h"
#include "chrome/browser/pref_service.h"
+#include "chrome/browser/pref_set_observer.h"
#include "chrome/browser/profile.h"
#include "chrome/browser/renderer_host/resource_dispatcher_host.h"
#include "chrome/browser/safe_browsing/safe_browsing_service.h"
@@ -953,6 +954,9 @@ class NetworkSection : public AdvancedSection,
views::Label* change_proxies_label_;
views::NativeButton* change_proxies_button_;
+ // Tracks the proxy preferences.
+ scoped_ptr<PrefSetObserver> proxy_prefs_;
+
DISALLOW_COPY_AND_ASSIGN(NetworkSection);
};
@@ -998,9 +1002,16 @@ void NetworkSection::InitControlLayout() {
true);
AddLeadingControl(layout, change_proxies_button_, indented_view_set_id,
false);
+
+ proxy_prefs_.reset(PrefSetObserver::CreateProxyPrefSetObserver(
+ profile()->GetPrefs(), this));
+ NotifyPrefChanged(NULL);
}
void NetworkSection::NotifyPrefChanged(const std::wstring* pref_name) {
+ if (!pref_name || proxy_prefs_->IsObserved(*pref_name)) {
+ change_proxies_button_->SetEnabled(!proxy_prefs_->IsManaged());
+ }
}
} // namespace
diff --git a/chrome/chrome_browser.gypi b/chrome/chrome_browser.gypi
index fc60271..5a5a262 100644
--- a/chrome/chrome_browser.gypi
+++ b/chrome/chrome_browser.gypi
@@ -2040,6 +2040,8 @@
'browser/pref_member.h',
'browser/pref_service.cc',
'browser/pref_service.h',
+ 'browser/pref_set_observer.cc',
+ 'browser/pref_set_observer.h',
'browser/pref_value_store.cc',
'browser/pref_value_store.h',
'browser/preferences_mac.cc',
diff --git a/chrome/chrome_tests.gypi b/chrome/chrome_tests.gypi
index ec79c96..317e666 100644
--- a/chrome/chrome_tests.gypi
+++ b/chrome/chrome_tests.gypi
@@ -987,7 +987,6 @@
'browser/in_process_webkit/dom_storage_dispatcher_host_unittest.cc',
'browser/in_process_webkit/webkit_context_unittest.cc',
'browser/in_process_webkit/webkit_thread_unittest.cc',
- 'browser/pref_value_store_unittest.cc',
'browser/keychain_mock_mac.cc',
'browser/keychain_mock_mac.h',
'browser/login_prompt_unittest.cc',
@@ -1024,6 +1023,8 @@
'browser/password_manager/password_store_win_unittest.cc',
'browser/pref_member_unittest.cc',
'browser/pref_service_unittest.cc',
+ 'browser/pref_set_observer_unittest.cc',
+ 'browser/pref_value_store_unittest.cc',
'browser/preferences_mock_mac.cc',
'browser/preferences_mock_mac.h',
'browser/printing/print_dialog_cloud_unittest.cc',