diff options
author | mnissler@chromium.org <mnissler@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-07-23 10:57:36 +0000 |
---|---|---|
committer | mnissler@chromium.org <mnissler@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-07-23 10:57:36 +0000 |
commit | 9a4a34ac02f7317286b5edde3ce98ec9cb35deb5 (patch) | |
tree | e6c5bc0a74c2708e703cc6edf086dc4d3bf5d467 /chrome | |
parent | 5b7a0cfbc0c936545c214e681df783cb7bd81222 (diff) | |
download | chromium_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.xib | 16 | ||||
-rw-r--r-- | chrome/browser/cocoa/preferences_window_controller.h | 4 | ||||
-rw-r--r-- | chrome/browser/cocoa/preferences_window_controller.mm | 10 | ||||
-rw-r--r-- | chrome/browser/gtk/options/advanced_contents_gtk.cc | 26 | ||||
-rw-r--r-- | chrome/browser/managed_prefs_banner_base.cc | 5 | ||||
-rw-r--r-- | chrome/browser/pref_set_observer.cc | 66 | ||||
-rw-r--r-- | chrome/browser/pref_set_observer.h | 53 | ||||
-rw-r--r-- | chrome/browser/pref_set_observer_unittest.cc | 88 | ||||
-rw-r--r-- | chrome/browser/views/options/advanced_contents_view.cc | 11 | ||||
-rw-r--r-- | chrome/chrome_browser.gypi | 2 | ||||
-rw-r--r-- | chrome/chrome_tests.gypi | 3 |
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', |