diff options
author | mnissler@chromium.org <mnissler@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-06-08 09:55:47 +0000 |
---|---|---|
committer | mnissler@chromium.org <mnissler@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-06-08 09:55:47 +0000 |
commit | 1703157a0410dbd23b8968aa8e6ce9e4adc45def (patch) | |
tree | ef2744a079dd79302e9e334c47bf227341243c94 /chrome | |
parent | c7f143e3f200aa626af2e29fec1f801081b2e31a (diff) | |
download | chromium_src-1703157a0410dbd23b8968aa8e6ce9e4adc45def.zip chromium_src-1703157a0410dbd23b8968aa8e6ce9e4adc45def.tar.gz chromium_src-1703157a0410dbd23b8968aa8e6ce9e4adc45def.tar.bz2 |
Managed preferences warning banner for the Linux preferences dialog.
BUG=43423
TEST=Unit test in managed_prefs_banner_base_unittest.cc, manual UI tests
Review URL: http://codereview.chromium.org/2425006
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@49151 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome')
-rw-r--r-- | chrome/app/generated_resources.grd | 3 | ||||
-rw-r--r-- | chrome/browser/gtk/options/general_page_gtk.cc | 15 | ||||
-rw-r--r-- | chrome/browser/gtk/options/general_page_gtk.h | 4 | ||||
-rw-r--r-- | chrome/browser/gtk/options/managed_prefs_banner_gtk.cc | 51 | ||||
-rw-r--r-- | chrome/browser/gtk/options/managed_prefs_banner_gtk.h | 39 | ||||
-rw-r--r-- | chrome/browser/gtk/options/options_layout_gtk.cc | 6 | ||||
-rw-r--r-- | chrome/browser/gtk/options/options_layout_gtk.h | 11 | ||||
-rw-r--r-- | chrome/browser/managed_prefs_banner_base.cc | 47 | ||||
-rw-r--r-- | chrome/browser/managed_prefs_banner_base.h | 47 | ||||
-rw-r--r-- | chrome/browser/managed_prefs_banner_base_unittest.cc | 66 | ||||
-rw-r--r-- | chrome/chrome_browser.gypi | 4 | ||||
-rwxr-xr-x | chrome/chrome_tests.gypi | 1 |
12 files changed, 287 insertions, 7 deletions
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd index c39ae8dc..93ad187 100644 --- a/chrome/app/generated_resources.grd +++ b/chrome/app/generated_resources.grd @@ -5873,6 +5873,9 @@ Keep your key file in a safe place. You will need it to create new versions of y <message name="IDS_OPTIONS_IMPORT_DATA_BUTTON" desc="Label for the import data button."> Import data from another browser... </message> + <message name="IDS_OPTIONS_MANAGED_PREFS" desc="Banner displayed in case there are managed options the user won't be able to change"> + Some options have been disabled by your IT administrator. + </message> <!-- Misc advanced option description strings. --> <message name="IDS_NETWORK_DNS_PREFETCH_ENABLED_DESCRIPTION" desc="In the advanced options tab, the text next to the checkbox that enables DNS prefetching. DNS prefetching involves scanning pages and user text entries, guessing what domain the user may next navigate to, and obtaining the domain's DNS information for that URL in advance. "> diff --git a/chrome/browser/gtk/options/general_page_gtk.cc b/chrome/browser/gtk/options/general_page_gtk.cc index e0778dc..3919232 100644 --- a/chrome/browser/gtk/options/general_page_gtk.cc +++ b/chrome/browser/gtk/options/general_page_gtk.cc @@ -14,6 +14,7 @@ #include "chrome/browser/gtk/accessible_widget_helper_gtk.h" #include "chrome/browser/gtk/gtk_util.h" #include "chrome/browser/gtk/keyword_editor_view.h" +#include "chrome/browser/gtk/options/managed_prefs_banner_gtk.h" #include "chrome/browser/gtk/options/options_layout_gtk.h" #include "chrome/browser/gtk/options/url_picker_dialog_gtk.h" #include "chrome/browser/net/url_fixer_upper.h" @@ -54,6 +55,12 @@ enum { SEARCH_ENGINES_COL_COUNT, }; +// Set of preferences which might be unavailable for editing when managed. +const wchar_t* kGeneralManagablePrefs[] = { + prefs::kHomePage, + prefs::kHomePageIsNewTabPage +}; + } // namespace /////////////////////////////////////////////////////////////////////////////// @@ -65,12 +72,14 @@ GeneralPageGtk::GeneralPageGtk(Profile* profile) default_search_initializing_(true), initializing_(true), default_browser_worker_( - new ShellIntegration::DefaultBrowserWorker(this)) { + new ShellIntegration::DefaultBrowserWorker(this)), + managed_prefs_banner_(profile->GetPrefs(), kGeneralManagablePrefs, + arraysize(kGeneralManagablePrefs)) { OptionsLayoutBuilderGtk options_builder; page_ = options_builder.get_page_widget(); - accessible_widget_helper_.reset(new AccessibleWidgetHelper( - page_, profile)); + accessible_widget_helper_.reset(new AccessibleWidgetHelper(page_, profile)); + options_builder.AddWidget(managed_prefs_banner_.banner_widget(), false); options_builder.AddOptionGroup( l10n_util::GetStringUTF8(IDS_OPTIONS_STARTUP_GROUP_NAME), InitStartupGroup(), true); diff --git a/chrome/browser/gtk/options/general_page_gtk.h b/chrome/browser/gtk/options/general_page_gtk.h index 10ec4c8..e2d0629 100644 --- a/chrome/browser/gtk/options/general_page_gtk.h +++ b/chrome/browser/gtk/options/general_page_gtk.h @@ -11,6 +11,7 @@ #include "app/gtk_signal.h" #include "chrome/browser/gtk/gtk_tree.h" +#include "chrome/browser/gtk/options/managed_prefs_banner_gtk.h" #include "chrome/browser/options_page_base.h" #include "chrome/browser/pref_member.h" #include "chrome/browser/search_engines/template_url_model.h" @@ -150,6 +151,9 @@ class GeneralPageGtk : public OptionsPageBase, // Helper object to manage accessibility metadata. scoped_ptr<AccessibleWidgetHelper> accessible_widget_helper_; + // Tracks managed preference warning banner state. + ManagedPrefsBannerGtk managed_prefs_banner_; + DISALLOW_COPY_AND_ASSIGN(GeneralPageGtk); }; diff --git a/chrome/browser/gtk/options/managed_prefs_banner_gtk.cc b/chrome/browser/gtk/options/managed_prefs_banner_gtk.cc new file mode 100644 index 0000000..71e3309 --- /dev/null +++ b/chrome/browser/gtk/options/managed_prefs_banner_gtk.cc @@ -0,0 +1,51 @@ +// 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/gtk/options/managed_prefs_banner_gtk.h" + +#include "app/l10n_util.h" +#include "app/resource_bundle.h" +#include "chrome/browser/gtk/gtk_theme_provider.h" +#include "chrome/browser/gtk/gtk_util.h" +#include "grit/generated_resources.h" + +namespace { + +// Padding within the banner box. +const int kBannerPadding = 3; + +} + +ManagedPrefsBannerGtk::ManagedPrefsBannerGtk(PrefService* prefs, + const wchar_t** relevant_prefs, + size_t count) + : ManagedPrefsBannerBase(prefs, relevant_prefs, count), + banner_widget_(NULL) { + InitWidget(); + OnUpdateVisibility(); +} + +void ManagedPrefsBannerGtk::InitWidget() { + banner_widget_ = gtk_frame_new(NULL); + GtkWidget* contents = gtk_hbox_new(FALSE, kBannerPadding); + gtk_container_set_border_width(GTK_CONTAINER(contents), kBannerPadding); + gtk_container_add(GTK_CONTAINER(banner_widget_), contents); + GtkWidget* warning_image = + gtk_image_new_from_stock(GTK_STOCK_DIALOG_WARNING, + GTK_ICON_SIZE_SMALL_TOOLBAR); + gtk_box_pack_start(GTK_BOX(contents), warning_image, FALSE, FALSE, 0); + std::string info_text(l10n_util::GetStringUTF8(IDS_OPTIONS_MANAGED_PREFS)); + GtkWidget* info_label = gtk_label_new(info_text.c_str()); + gtk_box_pack_start(GTK_BOX(contents), info_label, FALSE, FALSE, 0); + gtk_widget_show_all(banner_widget_); + gtk_widget_set_no_show_all(GTK_WIDGET(banner_widget_), TRUE); +} + +void ManagedPrefsBannerGtk::OnUpdateVisibility() { + DCHECK(banner_widget_); + if (DetermineVisibility()) + gtk_widget_show(banner_widget_); + else + gtk_widget_hide(banner_widget_); +} diff --git a/chrome/browser/gtk/options/managed_prefs_banner_gtk.h b/chrome/browser/gtk/options/managed_prefs_banner_gtk.h new file mode 100644 index 0000000..5007d98 --- /dev/null +++ b/chrome/browser/gtk/options/managed_prefs_banner_gtk.h @@ -0,0 +1,39 @@ +// 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_GTK_OPTIONS_MANAGED_PREFS_BANNER_GTK_H_ +#define CHROME_BROWSER_GTK_OPTIONS_MANAGED_PREFS_BANNER_GTK_H_ + +#include <set> + +#include <gtk/gtk.h> + +#include "chrome/browser/managed_prefs_banner_base.h" + +// Constructs and maintains a GTK widget displaying a warning banner. The banner +// is displayed on the preferences dialog whenever there are options that are +// not settable by the user due to policy. +class ManagedPrefsBannerGtk : public ManagedPrefsBannerBase { + public: + ManagedPrefsBannerGtk(PrefService* prefs, + const wchar_t** relevant_prefs, + size_t count); + virtual ~ManagedPrefsBannerGtk() { } + + GtkWidget* banner_widget() { return banner_widget_; } + + protected: + // Update widget visibility. + virtual void OnUpdateVisibility(); + + private: + // Construct the widget. + void InitWidget(); + + GtkWidget* banner_widget_; + + DISALLOW_COPY_AND_ASSIGN(ManagedPrefsBannerGtk); +}; + +#endif // CHROME_BROWSER_GTK_OPTIONS_MANAGED_PREFS_BANNER_GTK_H_ diff --git a/chrome/browser/gtk/options/options_layout_gtk.cc b/chrome/browser/gtk/options/options_layout_gtk.cc index 07fe2e1..c4a6e60 100644 --- a/chrome/browser/gtk/options/options_layout_gtk.cc +++ b/chrome/browser/gtk/options/options_layout_gtk.cc @@ -21,5 +21,9 @@ void OptionsLayoutBuilderGtk::AddOptionGroup(const std::string& title, gtk_box_pack_start(GTK_BOX(group), title_label, FALSE, FALSE, 0); gtk_container_add(GTK_CONTAINER(group), gtk_util::IndentWidget(content)); - gtk_box_pack_start(GTK_BOX(page_), group, expandable, expandable, 0); + AddWidget(group, expandable); +} + +void OptionsLayoutBuilderGtk::AddWidget(GtkWidget* content, bool expandable) { + gtk_box_pack_start(GTK_BOX(page_), content, expandable, expandable, 0); } diff --git a/chrome/browser/gtk/options/options_layout_gtk.h b/chrome/browser/gtk/options/options_layout_gtk.h index c4fedc6..0d397c0 100644 --- a/chrome/browser/gtk/options/options_layout_gtk.h +++ b/chrome/browser/gtk/options/options_layout_gtk.h @@ -18,12 +18,17 @@ class OptionsLayoutBuilderGtk { return page_; } - // Adds an option group to the table. Handles layout and the placing of - // separators between groups. If expandable is true, the content widget will - // be allowed to expand and fill any extra space when the dialog is resized. + // Adds an option group to the table. Handles layout and labels the group + // with the given title. If expandable is true, the content widget will be + // allowed to expand and fill any extra space when the dialog is resized. void AddOptionGroup(const std::string& title, GtkWidget* content, bool expandable); + // Adds a widget without title or special layout. If expandable is true, the + // content widget will be allowed to expand and fill any extra space when the + // dialog is resized. + void AddWidget(GtkWidget* content, bool expandable); + private: // The parent widget GtkWidget* page_; diff --git a/chrome/browser/managed_prefs_banner_base.cc b/chrome/browser/managed_prefs_banner_base.cc new file mode 100644 index 0000000..5251d7f --- /dev/null +++ b/chrome/browser/managed_prefs_banner_base.cc @@ -0,0 +1,47 @@ +// 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/managed_prefs_banner_base.h" + +#include "chrome/browser/pref_service.h" +#include "chrome/common/notification_details.h" +#include "chrome/common/notification_source.h" +#include "chrome/common/notification_type.h" + +ManagedPrefsBannerBase::ManagedPrefsBannerBase(PrefService* prefs, + const wchar_t** relevant_prefs, + size_t count) + : prefs_(prefs), + relevant_prefs_(relevant_prefs, relevant_prefs + count) { + for (PrefSet::const_iterator pref(relevant_prefs_.begin()); + pref != relevant_prefs_.end(); ++pref) + prefs_->AddPrefObserver(pref->c_str(), this); +} + +ManagedPrefsBannerBase::~ManagedPrefsBannerBase() { + for (PrefSet::const_iterator pref(relevant_prefs_.begin()); + pref != relevant_prefs_.end(); ++pref) + prefs_->RemovePrefObserver(pref->c_str(), this); +} + +void ManagedPrefsBannerBase::Observe(NotificationType type, + const NotificationSource& source, + const NotificationDetails& details) { + if (NotificationType::PREF_CHANGED == type) { + std::wstring* pref = Details<std::wstring>(details).ptr(); + if (pref && relevant_prefs_.count(*pref)) + OnUpdateVisibility(); + } +} + +bool ManagedPrefsBannerBase::DetermineVisibility() const { + for (PrefSet::const_iterator pref_name(relevant_prefs_.begin()); + pref_name != relevant_prefs_.end(); ++pref_name) { + const PrefService::Preference* pref = + prefs_->FindPreference(pref_name->c_str()); + if (pref && pref->IsManaged()) + return true; + } + return false; +} diff --git a/chrome/browser/managed_prefs_banner_base.h b/chrome/browser/managed_prefs_banner_base.h new file mode 100644 index 0000000..f0013ca --- /dev/null +++ b/chrome/browser/managed_prefs_banner_base.h @@ -0,0 +1,47 @@ +// 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_MANAGED_PREFS_BANNER_BASE_H_ +#define CHROME_BROWSER_MANAGED_PREFS_BANNER_BASE_H_ + +#include <set> +#include <string> + +#include "base/basictypes.h" +#include "chrome/common/notification_observer.h" + +class PrefService; + +// Common base functionality for the managed prefs warning banner displayed in +// the preference dialogs when there are options that are controlled by +// configuration policy and thus cannot be changed by the user. +class ManagedPrefsBannerBase : public NotificationObserver { + public: + ManagedPrefsBannerBase(PrefService* prefs, + const wchar_t** relevant_prefs, + size_t count); + virtual ~ManagedPrefsBannerBase(); + + // Determine whether the banner should be visible. + bool DetermineVisibility() const; + + // |NotificationObserver| implementation. + virtual void Observe(NotificationType type, + const NotificationSource& source, + const NotificationDetails& details); + + protected: + // Update banner visibility. This is called whenever a preference change is + // observed that may lead to changed visibility of the banner. Subclasses may + // override this in order to show/hide the banner. + virtual void OnUpdateVisibility() { } + + private: + PrefService* prefs_; + typedef std::set<std::wstring> PrefSet; + const PrefSet relevant_prefs_; + + DISALLOW_COPY_AND_ASSIGN(ManagedPrefsBannerBase); +}; +#endif // CHROME_BROWSER_MANAGED_PREFS_BANNER_BASE_H_ diff --git a/chrome/browser/managed_prefs_banner_base_unittest.cc b/chrome/browser/managed_prefs_banner_base_unittest.cc new file mode 100644 index 0000000..d11bbc1 --- /dev/null +++ b/chrome/browser/managed_prefs_banner_base_unittest.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/dummy_pref_store.h" +#include "chrome/browser/managed_prefs_banner_base.h" +#include "chrome/browser/pref_service.h" +#include "chrome/common/pref_names.h" +#include "testing/gmock/include/gmock/gmock.h" +#include "testing/gtest/include/gtest/gtest.h" + +// Tests whether managed preferences banner base functionality correctly +// determines banner visiblity. +class ManagedPrefsBannerBaseTest : public testing::Test { + public: + virtual void SetUp() { + managed_prefs_ = new DummyPrefStore; + user_prefs_ = new DummyPrefStore; + default_prefs_ = new DummyPrefStore; + pref_service_.reset(new PrefService( + new PrefValueStore(managed_prefs_, user_prefs_, default_prefs_))); + pref_service_->RegisterStringPref(prefs::kHomePage, L"http://google.com"); + pref_service_->RegisterBooleanPref(prefs::kHomePageIsNewTabPage, false); + } + + scoped_ptr<PrefService> pref_service_; + DummyPrefStore* managed_prefs_; + DummyPrefStore* user_prefs_; + DummyPrefStore* default_prefs_; +}; + +static const wchar_t* managed_prefs[] = { + prefs::kHomePage +}; + +TEST_F(ManagedPrefsBannerBaseTest, VisibilityTest) { + ManagedPrefsBannerBase banner(pref_service_.get(), managed_prefs, + arraysize(managed_prefs)); + EXPECT_FALSE(banner.DetermineVisibility()); + managed_prefs_->prefs()->SetBoolean(prefs::kHomePageIsNewTabPage, true); + EXPECT_FALSE(banner.DetermineVisibility()); + user_prefs_->prefs()->SetString(prefs::kHomePage, L"http://foo.com"); + EXPECT_FALSE(banner.DetermineVisibility()); + managed_prefs_->prefs()->SetString(prefs::kHomePage, L"http://bar.com"); + EXPECT_TRUE(banner.DetermineVisibility()); +} + +// Mock class that allows to capture the notification callback. +class ManagedPrefsBannerBaseMock : public ManagedPrefsBannerBase { + public: + ManagedPrefsBannerBaseMock(PrefService* pref_service, + const wchar_t** relevant_prefs, + size_t count) + : ManagedPrefsBannerBase(pref_service, relevant_prefs, count) { } + + MOCK_METHOD0(OnUpdateVisibility, void()); +}; + +TEST_F(ManagedPrefsBannerBaseTest, NotificationTest) { + ManagedPrefsBannerBaseMock banner(pref_service_.get(), managed_prefs, + arraysize(managed_prefs)); + EXPECT_CALL(banner, OnUpdateVisibility()).Times(0); + pref_service_->SetBoolean(prefs::kHomePageIsNewTabPage, true); + EXPECT_CALL(banner, OnUpdateVisibility()).Times(1); + pref_service_->SetString(prefs::kHomePage, L"http://foo.com"); +} diff --git a/chrome/chrome_browser.gypi b/chrome/chrome_browser.gypi index fc19b62..9750242 100644 --- a/chrome/chrome_browser.gypi +++ b/chrome/chrome_browser.gypi @@ -1425,6 +1425,8 @@ 'browser/gtk/options/general_page_gtk.h', 'browser/gtk/options/languages_page_gtk.cc', 'browser/gtk/options/languages_page_gtk.h', + 'browser/gtk/options/managed_prefs_banner_gtk.cc', + 'browser/gtk/options/managed_prefs_banner_gtk.h', 'browser/gtk/options/options_layout_gtk.cc', 'browser/gtk/options/options_layout_gtk.h', 'browser/gtk/options/options_window_gtk.cc', @@ -1652,6 +1654,8 @@ 'browser/login_prompt_win.cc', 'browser/mach_broker_mac.cc', 'browser/mach_broker_mac.h', + 'browser/managed_prefs_banner_base.cc', + 'browser/managed_prefs_banner_base.h', 'browser/memory_details.cc', 'browser/memory_details_linux.cc', 'browser/memory_details_mac.cc', diff --git a/chrome/chrome_tests.gypi b/chrome/chrome_tests.gypi index 3d39a03..83d5f1e 100755 --- a/chrome/chrome_tests.gypi +++ b/chrome/chrome_tests.gypi @@ -840,6 +840,7 @@ 'browser/keychain_mock_mac.h', 'browser/login_prompt_unittest.cc', 'browser/mach_broker_mac_unittest.cc', + 'browser/managed_prefs_banner_base_unittest.cc', 'browser/metrics/metrics_log_unittest.cc', 'browser/metrics/metrics_response_unittest.cc', 'browser/metrics/metrics_service_unittest.cc', |