summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorbartfab@chromium.org <bartfab@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-12-04 13:00:35 +0000
committerbartfab@chromium.org <bartfab@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-12-04 13:00:35 +0000
commit54b1a85e62edf9ac99afa0802f20002a1d487940 (patch)
tree8bd2e2698868ae26220594c6945fd42604135708
parent903d70ae6d3c46369394c0ada5ba45bc705e5e8f (diff)
downloadchromium_src-54b1a85e62edf9ac99afa0802f20002a1d487940.zip
chromium_src-54b1a85e62edf9ac99afa0802f20002a1d487940.tar.gz
chromium_src-54b1a85e62edf9ac99afa0802f20002a1d487940.tar.bz2
Add policy for ash launcher auto-hide behavior
This CL adds a policy that controls the ash launcher auto-hide behavior. It also modifies the way that the launcher context menu reads and toggles the current auto-hide behavior, ensuring that all changes go through the kShelfAutoHideBehaviorLocal pref that the policy can override. BUG=152929 TBR=davemoore@chromium.org Review URL: https://chromiumcodereview.appspot.com/11418114 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@170947 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--ash/root_window_controller.cc11
-rw-r--r--ash/root_window_controller.h4
-rw-r--r--ash/shell.cc11
-rw-r--r--ash/shell.h4
-rw-r--r--ash/shell/context_menu.cc11
-rw-r--r--ash/shell_unittest.cc37
-rw-r--r--ash/wm/shelf_layout_manager.h2
-rw-r--r--chrome/app/policy/policy_templates.json42
-rw-r--r--chrome/browser/policy/configuration_policy_handler_list.cc3
-rw-r--r--chrome/browser/ui/ash/launcher/chrome_launcher_controller.h14
-rw-r--r--chrome/browser/ui/ash/launcher/chrome_launcher_controller_per_app.cc112
-rw-r--r--chrome/browser/ui/ash/launcher/chrome_launcher_controller_per_app.h19
-rw-r--r--chrome/browser/ui/ash/launcher/chrome_launcher_controller_per_browser.cc113
-rw-r--r--chrome/browser/ui/ash/launcher/chrome_launcher_controller_per_browser.h19
-rw-r--r--chrome/browser/ui/ash/launcher/launcher_context_menu.cc11
-rw-r--r--chrome/test/data/policy/policy_test_cases.json8
16 files changed, 272 insertions, 149 deletions
diff --git a/ash/root_window_controller.cc b/ash/root_window_controller.cc
index cc6d2d4..77a096c 100644
--- a/ash/root_window_controller.cc
+++ b/ash/root_window_controller.cc
@@ -486,17 +486,6 @@ ShelfAlignment RootWindowController::GetShelfAlignment() {
return shelf_->alignment();
}
-bool RootWindowController::IsShelfAutoHideMenuHideChecked() {
- return GetShelfAutoHideBehavior() == ash::SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS;
-}
-
-ShelfAutoHideBehavior
-RootWindowController::GetToggledShelfAutoHideBehavior() {
- return IsShelfAutoHideMenuHideChecked() ?
- ash::SHELF_AUTO_HIDE_BEHAVIOR_NEVER :
- ash::SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS;
-}
-
////////////////////////////////////////////////////////////////////////////////
// RootWindowController, private:
diff --git a/ash/root_window_controller.h b/ash/root_window_controller.h
index b34124e..842c987 100644
--- a/ash/root_window_controller.h
+++ b/ash/root_window_controller.h
@@ -152,10 +152,6 @@ class ASH_EXPORT RootWindowController {
bool SetShelfAlignment(ShelfAlignment alignment);
ShelfAlignment GetShelfAlignment();
- // Get the shelf's auto hide status.
- bool IsShelfAutoHideMenuHideChecked();
- ShelfAutoHideBehavior GetToggledShelfAutoHideBehavior();
-
private:
// Creates each of the special window containers that holds windows of various
// types in the shell UI.
diff --git a/ash/shell.cc b/ash/shell.cc
index 53ec34c..15d33f5 100644
--- a/ash/shell.cc
+++ b/ash/shell.cc
@@ -733,17 +733,6 @@ ShelfAutoHideBehavior Shell::GetShelfAutoHideBehavior(
return GetRootWindowController(root_window)->GetShelfAutoHideBehavior();
}
-bool Shell::IsShelfAutoHideMenuHideChecked(aura::RootWindow* root_window) {
- return GetRootWindowController(root_window)->GetShelfAutoHideBehavior() ==
- ash::SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS;
-}
-
-ShelfAutoHideBehavior Shell::GetToggledShelfAutoHideBehavior(
- aura::RootWindow* root_window) {
- return GetRootWindowController(root_window)->
- GetToggledShelfAutoHideBehavior();
-}
-
void Shell::SetShelfAlignment(ShelfAlignment alignment,
aura::RootWindow* root_window) {
if (GetRootWindowController(root_window)->SetShelfAlignment(alignment))
diff --git a/ash/shell.h b/ash/shell.h
index 71181bca..6880ecb 100644
--- a/ash/shell.h
+++ b/ash/shell.h
@@ -351,10 +351,6 @@ class ASH_EXPORT Shell : internal::SystemModalContainerEventFilterDelegate,
ShelfAutoHideBehavior GetShelfAutoHideBehavior(
aura::RootWindow* root_window) const;
- bool IsShelfAutoHideMenuHideChecked(aura::RootWindow* root);
- ShelfAutoHideBehavior GetToggledShelfAutoHideBehavior(
- aura::RootWindow* root_window);
-
// Sets/gets shelf's alignment on |root_window|.
void SetShelfAlignment(ShelfAlignment alignment,
aura::RootWindow* root_window);
diff --git a/ash/shell/context_menu.cc b/ash/shell/context_menu.cc
index fe23f20..700563c 100644
--- a/ash/shell/context_menu.cc
+++ b/ash/shell/context_menu.cc
@@ -33,7 +33,8 @@ ContextMenu::~ContextMenu() {
bool ContextMenu::IsCommandIdChecked(int command_id) const {
switch (command_id) {
case MENU_AUTO_HIDE:
- return Shell::GetInstance()->IsShelfAutoHideMenuHideChecked(root_window_);
+ return Shell::GetInstance()->GetShelfAutoHideBehavior(root_window_) ==
+ ash::SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS;
default:
return false;
}
@@ -50,10 +51,14 @@ bool ContextMenu::GetAcceleratorForCommandId(
}
void ContextMenu::ExecuteCommand(int command_id) {
+ Shell* shell = Shell::GetInstance();
switch (static_cast<MenuItem>(command_id)) {
case MENU_AUTO_HIDE:
- Shell::GetInstance()->SetShelfAutoHideBehavior(
- Shell::GetInstance()->GetToggledShelfAutoHideBehavior(root_window_),
+ shell->SetShelfAutoHideBehavior(
+ shell->GetShelfAutoHideBehavior(root_window_) ==
+ SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS ?
+ SHELF_AUTO_HIDE_BEHAVIOR_NEVER :
+ SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS,
root_window_);
break;
case MENU_ALIGNMENT_MENU:
diff --git a/ash/shell_unittest.cc b/ash/shell_unittest.cc
index 8885320..6fbab6a 100644
--- a/ash/shell_unittest.cc
+++ b/ash/shell_unittest.cc
@@ -352,8 +352,8 @@ std::vector<aura::Window*> BuildPathToRoot(aura::Window* window) {
} // namespace
-// Various assertions around IsAutoHideMenuHideChecked() and
-// ToggleAutoHideMenu().
+// Various assertions around SetShelfAutoHideBehavior() and
+// GetShelfAutoHideBehavior().
TEST_F(ShellTest, ToggleAutoHide) {
scoped_ptr<aura::Window> window(new aura::Window(NULL));
window->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_NORMAL);
@@ -363,28 +363,27 @@ TEST_F(ShellTest, ToggleAutoHide) {
window->Show();
wm::ActivateWindow(window.get());
- internal::RootWindowController* controller =
- Shell::GetPrimaryRootWindowController();
- controller->SetShelfAutoHideBehavior(ash::SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS);
+ Shell* shell = Shell::GetInstance();
+ aura::RootWindow* root_window = Shell::GetPrimaryRootWindow();
+ shell->SetShelfAutoHideBehavior(ash::SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS,
+ root_window);
EXPECT_EQ(ash::SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS,
- controller->GetShelfAutoHideBehavior());
- EXPECT_TRUE(controller->IsShelfAutoHideMenuHideChecked());
- controller->SetShelfAutoHideBehavior(
- controller->GetToggledShelfAutoHideBehavior());
+ shell->GetShelfAutoHideBehavior(root_window));
+ shell->SetShelfAutoHideBehavior(ash::SHELF_AUTO_HIDE_BEHAVIOR_NEVER,
+ root_window);
EXPECT_EQ(ash::SHELF_AUTO_HIDE_BEHAVIOR_NEVER,
- controller->GetShelfAutoHideBehavior());
-
+ shell->GetShelfAutoHideBehavior(root_window));
window->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_MAXIMIZED);
- EXPECT_FALSE(controller->IsShelfAutoHideMenuHideChecked());
- controller->SetShelfAutoHideBehavior(
- controller->GetToggledShelfAutoHideBehavior());
+ EXPECT_EQ(ash::SHELF_AUTO_HIDE_BEHAVIOR_NEVER,
+ shell->GetShelfAutoHideBehavior(root_window));
+ shell->SetShelfAutoHideBehavior(ash::SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS,
+ root_window);
EXPECT_EQ(ash::SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS,
- controller->GetShelfAutoHideBehavior());
- EXPECT_TRUE(controller->IsShelfAutoHideMenuHideChecked());
- controller->SetShelfAutoHideBehavior(
- controller->GetToggledShelfAutoHideBehavior());
+ shell->GetShelfAutoHideBehavior(root_window));
+ shell->SetShelfAutoHideBehavior(ash::SHELF_AUTO_HIDE_BEHAVIOR_NEVER,
+ root_window);
EXPECT_EQ(ash::SHELF_AUTO_HIDE_BEHAVIOR_NEVER,
- controller->GetShelfAutoHideBehavior());
+ shell->GetShelfAutoHideBehavior(root_window));
}
// This verifies WindowObservers are removed when a window is destroyed after
diff --git a/ash/wm/shelf_layout_manager.h b/ash/wm/shelf_layout_manager.h
index 52873b1..c6c0faa 100644
--- a/ash/wm/shelf_layout_manager.h
+++ b/ash/wm/shelf_layout_manager.h
@@ -11,7 +11,6 @@
#include "ash/wm/shelf_types.h"
#include "base/basictypes.h"
#include "base/compiler_specific.h"
-#include "base/gtest_prod_util.h"
#include "base/observer_list.h"
#include "base/timer.h"
#include "ui/aura/layout_manager.h"
@@ -176,7 +175,6 @@ class ASH_EXPORT ShelfLayoutManager :
class UpdateShelfObserver;
friend class ash::ScreenAsh;
friend class ShelfLayoutManagerTest;
- FRIEND_TEST_ALL_PREFIXES(ShelfLayoutManagerTest, SetAutoHideBehavior);
struct TargetBounds {
TargetBounds();
diff --git a/chrome/app/policy/policy_templates.json b/chrome/app/policy/policy_templates.json
index c888dcb..7de3eda 100644
--- a/chrome/app/policy/policy_templates.json
+++ b/chrome/app/policy/policy_templates.json
@@ -112,7 +112,7 @@
# persistent IDs for all fields (but not for groups!) are needed. These are
# specified by the 'id' keys of each policy. NEVER CHANGE EXISTING IDs,
# because doing so would break the deployed wire format!
-# For your editing convenience: highest ID currently used: 165
+# For your editing convenience: highest ID currently used: 166
#
# Placeholders:
# The following placeholder strings are automatically substituted:
@@ -3320,6 +3320,46 @@
If this policy is left not set, the users will be able to change whether the built-in DNS client is used by editing chrome://flags or specifying a command-line flag.''',
},
+ {
+ 'name': 'ShelfAutoHideBehavior',
+ 'type': 'string-enum',
+ 'schema': {
+ 'type': 'string',
+ 'enum': [
+ 'Always',
+ 'Never'
+ ],
+ },
+ 'items': [
+ {
+ 'name': 'AlwaysAutoHideShelf',
+ 'value': 'Always',
+ 'caption': '''Always auto-hide the shelf''',
+ },
+ {
+ 'name': 'NeverAutoHideShelf',
+ 'value': 'Never',
+ 'caption': '''Never auto-hide the shelf''',
+ },
+ ],
+ 'supported_on': ['chrome_os:25-'],
+ 'features': {
+ 'dynamic_refresh': True,
+ 'can_be_recommended': True,
+ },
+ 'example_value': 'Always',
+ 'id': 166,
+ 'caption': '''Control shelf auto-hiding''',
+ 'desc': '''Control auto-hiding of the <ph name="PRODUCT_OS_NAME">$2<ex>Google Chrome OS</ex></ph> shelf.
+
+ If this policy is set to 'AlwaysAutoHideShelf', the shelf will always auto-hide.
+
+ If this policy is set to 'NeverAutoHideShelf', the shelf never auto-hide.
+
+ If you set this policy, users cannot change or override it.
+
+ If the policy is left not set, users can choose whether the shelf should auto-hide.''',
+ },
],
'messages': {
# Messages that are not associated to any policies.
diff --git a/chrome/browser/policy/configuration_policy_handler_list.cc b/chrome/browser/policy/configuration_policy_handler_list.cc
index bd52280..a798ddf 100644
--- a/chrome/browser/policy/configuration_policy_handler_list.cc
+++ b/chrome/browser/policy/configuration_policy_handler_list.cc
@@ -335,6 +335,9 @@ const PolicyToPreferenceMapEntry kSimplePolicyMap[] = {
{ key::kShowLogoutButtonInTray,
prefs::kShowLogoutButtonInTray,
Value::TYPE_BOOLEAN },
+ { key::kShelfAutoHideBehavior,
+ prefs::kShelfAutoHideBehaviorLocal,
+ Value::TYPE_STRING },
#endif // defined(OS_CHROMEOS)
#if !defined(OS_MACOSX) && !defined(OS_CHROMEOS)
diff --git a/chrome/browser/ui/ash/launcher/chrome_launcher_controller.h b/chrome/browser/ui/ash/launcher/chrome_launcher_controller.h
index 0c85646..bc3c4c5 100644
--- a/chrome/browser/ui/ash/launcher/chrome_launcher_controller.h
+++ b/chrome/browser/ui/ash/launcher/chrome_launcher_controller.h
@@ -216,8 +216,18 @@ class ChromeLauncherController
virtual Profile* profile() = 0;
- virtual void SetAutoHideBehavior(ash::ShelfAutoHideBehavior behavior,
- aura::RootWindow* root_window) = 0;
+ // Gets the shelf auto-hide behavior on |root_window|.
+ virtual ash::ShelfAutoHideBehavior GetShelfAutoHideBehavior(
+ aura::RootWindow* root_window) const = 0;
+
+ // Returns |true| if the user is allowed to modify the shelf auto-hide
+ // behavior on |root_window|.
+ virtual bool CanUserModifyShelfAutoHideBehavior(
+ aura::RootWindow* root_window) const = 0;
+
+ // Toggles the shelf auto-hide behavior on |root_window|. Does nothing if the
+ // user is not allowed to modify the auto-hide behavior.
+ virtual void ToggleShelfAutoHideBehavior(aura::RootWindow* root_window) = 0;
// The tab no longer represents its previously identified application.
virtual void RemoveTabFromRunningApp(TabContents* tab,
diff --git a/chrome/browser/ui/ash/launcher/chrome_launcher_controller_per_app.cc b/chrome/browser/ui/ash/launcher/chrome_launcher_controller_per_app.cc
index 4300c84..5895692 100644
--- a/chrome/browser/ui/ash/launcher/chrome_launcher_controller_per_app.cc
+++ b/chrome/browser/ui/ash/launcher/chrome_launcher_controller_per_app.cc
@@ -127,12 +127,12 @@ std::string GetLocalOrRemotePref(PrefService* pref_service,
return value.empty() ? pref_service->GetString(synced_path) : value;
}
-// If prefs have synced and the pref value at |local_path| is empty the value
+// If prefs have synced and no user-set value exists at |local_path|, the value
// from |synced_path| is copied to |local_path|.
void MaybePropagatePrefToLocal(PrefService* pref_service,
const char* local_path,
const char* synced_path) {
- if (pref_service->GetString(local_path).empty() &&
+ if (!pref_service->FindPreference(local_path)->HasUserSetting() &&
pref_service->IsSyncing()) {
// First time the user is using this machine, propagate from remote to
// local.
@@ -177,6 +177,15 @@ ChromeLauncherControllerPerApp::ChromeLauncherControllerPerApp(
prefs::kPinnedLauncherApps,
base::Bind(&ChromeLauncherControllerPerApp::UpdateAppLaunchersFromPref,
base::Unretained(this)));
+ pref_change_registrar_.Add(
+ prefs::kShelfAlignmentLocal,
+ base::Bind(&ChromeLauncherControllerPerApp::SetShelfAlignmentFromPrefs,
+ base::Unretained(this)));
+ pref_change_registrar_.Add(
+ prefs::kShelfAutoHideBehaviorLocal,
+ base::Bind(&ChromeLauncherControllerPerApp::
+ SetShelfAutoHideBehaviorFromPrefs,
+ base::Unretained(this)));
}
ChromeLauncherControllerPerApp::~ChromeLauncherControllerPerApp() {
@@ -230,8 +239,9 @@ void ChromeLauncherControllerPerApp::Init() {
SetShelfAutoHideBehaviorFromPrefs();
SetShelfAlignmentFromPrefs();
PrefService* prefs = profile_->GetPrefs();
- if (prefs->GetString(prefs::kShelfAlignmentLocal).empty() ||
- prefs->GetString(prefs::kShelfAutoHideBehaviorLocal).empty()) {
+ if (!prefs->FindPreference(prefs::kShelfAlignmentLocal)->HasUserSetting() ||
+ !prefs->FindPreference(prefs::kShelfAutoHideBehaviorLocal)->
+ HasUserSetting()) {
// This causes OnIsSyncingChanged to be called when the value of
// PrefService::IsSyncing() changes.
prefs->AddObserver(this);
@@ -563,28 +573,41 @@ bool ChromeLauncherControllerPerApp::CanPin() const {
return pref && pref->IsUserModifiable();
}
-void ChromeLauncherControllerPerApp::SetAutoHideBehavior(
- ash::ShelfAutoHideBehavior behavior,
- aura::RootWindow* root_window) {
- ash::Shell::GetInstance()->SetShelfAutoHideBehavior(
- behavior,
- root_window);
- // TODO(oshima): Support multiple launcher.
- if (root_window != ash::Shell::GetPrimaryRootWindow())
- return;
+ash::ShelfAutoHideBehavior
+ ChromeLauncherControllerPerApp::GetShelfAutoHideBehavior(
+ aura::RootWindow* root_window) const {
+ // TODO(oshima): Support multiple launchers.
- const char* value = NULL;
- switch (behavior) {
- case ash::SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS:
- value = ash::kShelfAutoHideBehaviorAlways;
- break;
- case ash::SHELF_AUTO_HIDE_BEHAVIOR_NEVER:
- value = ash::kShelfAutoHideBehaviorNever;
- break;
- }
- // See comment in |kShelfAlignment| about why we have two prefs here.
- profile_->GetPrefs()->SetString(prefs::kShelfAutoHideBehaviorLocal, value);
- profile_->GetPrefs()->SetString(prefs::kShelfAutoHideBehavior, value);
+ // See comment in |kShelfAlignment| as to why we consider two prefs.
+ const std::string behavior_value(
+ GetLocalOrRemotePref(profile_->GetPrefs(),
+ prefs::kShelfAutoHideBehaviorLocal,
+ prefs::kShelfAutoHideBehavior));
+
+ // Note: To maintain sync compatibility with old images of chrome/chromeos
+ // the set of values that may be encountered includes the now-extinct
+ // "Default" as well as "Never" and "Always", "Default" should now
+ // be treated as "Never" (http://crbug.com/146773).
+ if (behavior_value == ash::kShelfAutoHideBehaviorAlways)
+ return ash::SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS;
+ return ash::SHELF_AUTO_HIDE_BEHAVIOR_NEVER;
+}
+
+bool ChromeLauncherControllerPerApp::CanUserModifyShelfAutoHideBehavior(
+ aura::RootWindow* root_window) const {
+ // TODO(oshima): Support multiple launchers.
+ return profile_->GetPrefs()->
+ FindPreference(prefs::kShelfAutoHideBehaviorLocal)->IsUserModifiable();
+}
+
+void ChromeLauncherControllerPerApp::ToggleShelfAutoHideBehavior(
+ aura::RootWindow* root_window) {
+ ash::ShelfAutoHideBehavior behavior = GetShelfAutoHideBehavior(root_window) ==
+ ash::SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS ?
+ ash::SHELF_AUTO_HIDE_BEHAVIOR_NEVER :
+ ash::SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS;
+ SetShelfAutoHideBehaviorPrefs(behavior, root_window);
+ return;
}
void ChromeLauncherControllerPerApp::RemoveTabFromRunningApp(
@@ -981,25 +1004,32 @@ void ChromeLauncherControllerPerApp::UpdateAppLaunchersFromPref() {
DoPinAppWithID(*pref_app_id);
}
-void ChromeLauncherControllerPerApp::SetShelfAutoHideBehaviorFromPrefs() {
- // See comment in |kShelfAlignment| as to why we consider two prefs.
- const std::string behavior_value(
- GetLocalOrRemotePref(profile_->GetPrefs(),
- prefs::kShelfAutoHideBehaviorLocal,
- prefs::kShelfAutoHideBehavior));
+void ChromeLauncherControllerPerApp::SetShelfAutoHideBehaviorPrefs(
+ ash::ShelfAutoHideBehavior behavior,
+ aura::RootWindow* root_window) {
+ // TODO(oshima): Support multiple launchers.
+ if (root_window != ash::Shell::GetPrimaryRootWindow())
+ return;
- // Note: To maintain sync compatibility with old images of chrome/chromeos
- // the set of values that may be encountered includes the now-extinct
- // "Default" as well as "Never" and "Always", "Default" should now
- // be treated as "Never".
- // (http://code.google.com/p/chromium/issues/detail?id=146773)
- ash::ShelfAutoHideBehavior behavior =
- ash::SHELF_AUTO_HIDE_BEHAVIOR_NEVER;
- if (behavior_value == ash::kShelfAutoHideBehaviorAlways)
- behavior = ash::SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS;
+ const char* value = NULL;
+ switch (behavior) {
+ case ash::SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS:
+ value = ash::kShelfAutoHideBehaviorAlways;
+ break;
+ case ash::SHELF_AUTO_HIDE_BEHAVIOR_NEVER:
+ value = ash::kShelfAutoHideBehaviorNever;
+ break;
+ }
+ // See comment in |kShelfAlignment| about why we have two prefs here.
+ profile_->GetPrefs()->SetString(prefs::kShelfAutoHideBehaviorLocal, value);
+ profile_->GetPrefs()->SetString(prefs::kShelfAutoHideBehavior, value);
+}
+
+void ChromeLauncherControllerPerApp::SetShelfAutoHideBehaviorFromPrefs() {
// TODO(oshima): Support multiple displays.
+ aura::RootWindow* root_window = ash::Shell::GetPrimaryRootWindow();
ash::Shell::GetInstance()->SetShelfAutoHideBehavior(
- behavior, ash::Shell::GetPrimaryRootWindow());
+ GetShelfAutoHideBehavior(root_window), root_window);
}
void ChromeLauncherControllerPerApp::SetShelfAlignmentFromPrefs() {
diff --git a/chrome/browser/ui/ash/launcher/chrome_launcher_controller_per_app.h b/chrome/browser/ui/ash/launcher/chrome_launcher_controller_per_app.h
index 2d61d90..b3edf62 100644
--- a/chrome/browser/ui/ash/launcher/chrome_launcher_controller_per_app.h
+++ b/chrome/browser/ui/ash/launcher/chrome_launcher_controller_per_app.h
@@ -189,8 +189,19 @@ class ChromeLauncherControllerPerApp
virtual Profile* profile() OVERRIDE;
- virtual void SetAutoHideBehavior(ash::ShelfAutoHideBehavior behavior,
- aura::RootWindow* root_window) OVERRIDE;
+ // Gets the shelf auto-hide behavior on |root_window|.
+ virtual ash::ShelfAutoHideBehavior GetShelfAutoHideBehavior(
+ aura::RootWindow* root_window) const OVERRIDE;
+
+ // Returns |true| if the user is allowed to modify the shelf auto-hide
+ // behavior on |root_window|.
+ virtual bool CanUserModifyShelfAutoHideBehavior(
+ aura::RootWindow* root_window) const OVERRIDE;
+
+ // Toggles the shelf auto-hide behavior on |root_window|. Does nothing if the
+ // user is not allowed to modify the auto-hide behavior.
+ virtual void ToggleShelfAutoHideBehavior(
+ aura::RootWindow* root_window) OVERRIDE;
// The tab no longer represents its previously identified application.
virtual void RemoveTabFromRunningApp(TabContents* tab,
@@ -281,6 +292,10 @@ class ChromeLauncherControllerPerApp
// Re-syncs launcher model with prefs::kPinnedLauncherApps.
void UpdateAppLaunchersFromPref();
+ // Persists the shelf auto-hide behavior to prefs.
+ void SetShelfAutoHideBehaviorPrefs(ash::ShelfAutoHideBehavior behavior,
+ aura::RootWindow* root_window);
+
// Sets the shelf auto-hide behavior from prefs.
void SetShelfAutoHideBehaviorFromPrefs();
diff --git a/chrome/browser/ui/ash/launcher/chrome_launcher_controller_per_browser.cc b/chrome/browser/ui/ash/launcher/chrome_launcher_controller_per_browser.cc
index 9fcfc55..920653f 100644
--- a/chrome/browser/ui/ash/launcher/chrome_launcher_controller_per_browser.cc
+++ b/chrome/browser/ui/ash/launcher/chrome_launcher_controller_per_browser.cc
@@ -128,12 +128,12 @@ std::string GetLocalOrRemotePref(PrefService* pref_service,
return value.empty() ? pref_service->GetString(synced_path) : value;
}
-// If prefs have synced and the pref value at |local_path| is empty the value
+// If prefs have synced and no user-set value exists at |local_path|, the value
// from |synced_path| is copied to |local_path|.
void MaybePropagatePrefToLocal(PrefService* pref_service,
const char* local_path,
const char* synced_path) {
- if (pref_service->GetString(local_path).empty() &&
+ if (!pref_service->FindPreference(local_path)->HasUserSetting() &&
pref_service->IsSyncing()) {
// First time the user is using this machine, propagate from remote to
// local.
@@ -179,6 +179,16 @@ ChromeLauncherControllerPerBrowser::ChromeLauncherControllerPerBrowser(
base::Bind(&ChromeLauncherControllerPerBrowser::
UpdateAppLaunchersFromPref,
base::Unretained(this)));
+ pref_change_registrar_.Add(
+ prefs::kShelfAlignmentLocal,
+ base::Bind(&ChromeLauncherControllerPerBrowser::
+ SetShelfAlignmentFromPrefs,
+ base::Unretained(this)));
+ pref_change_registrar_.Add(
+ prefs::kShelfAutoHideBehaviorLocal,
+ base::Bind(&ChromeLauncherControllerPerBrowser::
+ SetShelfAutoHideBehaviorFromPrefs,
+ base::Unretained(this)));
}
ChromeLauncherControllerPerBrowser::~ChromeLauncherControllerPerBrowser() {
@@ -233,8 +243,9 @@ void ChromeLauncherControllerPerBrowser::Init() {
SetShelfAutoHideBehaviorFromPrefs();
SetShelfAlignmentFromPrefs();
PrefService* prefs = profile_->GetPrefs();
- if (prefs->GetString(prefs::kShelfAlignmentLocal).empty() ||
- prefs->GetString(prefs::kShelfAutoHideBehaviorLocal).empty()) {
+ if (!prefs->FindPreference(prefs::kShelfAlignmentLocal)->HasUserSetting() ||
+ !prefs->FindPreference(prefs::kShelfAutoHideBehaviorLocal)->
+ HasUserSetting()) {
// This causes OnIsSyncingChanged to be called when the value of
// PrefService::IsSyncing() changes.
prefs->AddObserver(this);
@@ -568,28 +579,41 @@ bool ChromeLauncherControllerPerBrowser::CanPin() const {
return pref && pref->IsUserModifiable();
}
-void ChromeLauncherControllerPerBrowser::SetAutoHideBehavior(
- ash::ShelfAutoHideBehavior behavior,
- aura::RootWindow* root_window) {
- ash::Shell::GetInstance()->SetShelfAutoHideBehavior(
- behavior,
- root_window);
- // TODO(oshima): Support multiple launcher.
- if (root_window != ash::Shell::GetPrimaryRootWindow())
- return;
+ash::ShelfAutoHideBehavior
+ ChromeLauncherControllerPerBrowser::GetShelfAutoHideBehavior(
+ aura::RootWindow* root_window) const {
+ // TODO(oshima): Support multiple launchers.
- const char* value = NULL;
- switch (behavior) {
- case ash::SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS:
- value = ash::kShelfAutoHideBehaviorAlways;
- break;
- case ash::SHELF_AUTO_HIDE_BEHAVIOR_NEVER:
- value = ash::kShelfAutoHideBehaviorNever;
- break;
- }
- // See comment in |kShelfAlignment| about why we have two prefs here.
- profile_->GetPrefs()->SetString(prefs::kShelfAutoHideBehaviorLocal, value);
- profile_->GetPrefs()->SetString(prefs::kShelfAutoHideBehavior, value);
+ // See comment in |kShelfAlignment| as to why we consider two prefs.
+ const std::string behavior_value(
+ GetLocalOrRemotePref(profile_->GetPrefs(),
+ prefs::kShelfAutoHideBehaviorLocal,
+ prefs::kShelfAutoHideBehavior));
+
+ // Note: To maintain sync compatibility with old images of chrome/chromeos
+ // the set of values that may be encountered includes the now-extinct
+ // "Default" as well as "Never" and "Always", "Default" should now
+ // be treated as "Never" (http://crbug.com/146773).
+ if (behavior_value == ash::kShelfAutoHideBehaviorAlways)
+ return ash::SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS;
+ return ash::SHELF_AUTO_HIDE_BEHAVIOR_NEVER;
+}
+
+bool ChromeLauncherControllerPerBrowser::CanUserModifyShelfAutoHideBehavior(
+ aura::RootWindow* root_window) const {
+ // TODO(oshima): Support multiple launchers.
+ return profile_->GetPrefs()->
+ FindPreference(prefs::kShelfAutoHideBehaviorLocal)->IsUserModifiable();
+}
+
+void ChromeLauncherControllerPerBrowser::ToggleShelfAutoHideBehavior(
+ aura::RootWindow* root_window) {
+ ash::ShelfAutoHideBehavior behavior = GetShelfAutoHideBehavior(root_window) ==
+ ash::SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS ?
+ ash::SHELF_AUTO_HIDE_BEHAVIOR_NEVER :
+ ash::SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS;
+ SetShelfAutoHideBehaviorPrefs(behavior, root_window);
+ return;
}
void ChromeLauncherControllerPerBrowser::RemoveTabFromRunningApp(
@@ -989,25 +1013,32 @@ void ChromeLauncherControllerPerBrowser::UpdateAppLaunchersFromPref() {
DoPinAppWithID(*pref_app_id);
}
-void ChromeLauncherControllerPerBrowser::SetShelfAutoHideBehaviorFromPrefs() {
- // See comment in |kShelfAlignment| as to why we consider two prefs.
- const std::string behavior_value(
- GetLocalOrRemotePref(profile_->GetPrefs(),
- prefs::kShelfAutoHideBehaviorLocal,
- prefs::kShelfAutoHideBehavior));
+void ChromeLauncherControllerPerBrowser::SetShelfAutoHideBehaviorPrefs(
+ ash::ShelfAutoHideBehavior behavior,
+ aura::RootWindow* root_window) {
+ // TODO(oshima): Support multiple launchers.
+ if (root_window != ash::Shell::GetPrimaryRootWindow())
+ return;
- // Note: To maintain sync compatibility with old images of chrome/chromeos
- // the set of values that may be encountered includes the now-extinct
- // "Default" as well as "Never" and "Always", "Default" should now
- // be treated as "Never".
- // (http://code.google.com/p/chromium/issues/detail?id=146773)
- ash::ShelfAutoHideBehavior behavior =
- ash::SHELF_AUTO_HIDE_BEHAVIOR_NEVER;
- if (behavior_value == ash::kShelfAutoHideBehaviorAlways)
- behavior = ash::SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS;
+ const char* value = NULL;
+ switch (behavior) {
+ case ash::SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS:
+ value = ash::kShelfAutoHideBehaviorAlways;
+ break;
+ case ash::SHELF_AUTO_HIDE_BEHAVIOR_NEVER:
+ value = ash::kShelfAutoHideBehaviorNever;
+ break;
+ }
+ // See comment in |kShelfAlignment| about why we have two prefs here.
+ profile_->GetPrefs()->SetString(prefs::kShelfAutoHideBehaviorLocal, value);
+ profile_->GetPrefs()->SetString(prefs::kShelfAutoHideBehavior, value);
+}
+
+void ChromeLauncherControllerPerBrowser::SetShelfAutoHideBehaviorFromPrefs() {
// TODO(oshima): Support multiple displays.
+ aura::RootWindow* root_window = ash::Shell::GetPrimaryRootWindow();
ash::Shell::GetInstance()->SetShelfAutoHideBehavior(
- behavior, ash::Shell::GetPrimaryRootWindow());
+ GetShelfAutoHideBehavior(root_window), root_window);
}
void ChromeLauncherControllerPerBrowser::SetShelfAlignmentFromPrefs() {
diff --git a/chrome/browser/ui/ash/launcher/chrome_launcher_controller_per_browser.h b/chrome/browser/ui/ash/launcher/chrome_launcher_controller_per_browser.h
index 5ef6ad1..e139857 100644
--- a/chrome/browser/ui/ash/launcher/chrome_launcher_controller_per_browser.h
+++ b/chrome/browser/ui/ash/launcher/chrome_launcher_controller_per_browser.h
@@ -191,8 +191,19 @@ class ChromeLauncherControllerPerBrowser
virtual Profile* profile() OVERRIDE;
- virtual void SetAutoHideBehavior(ash::ShelfAutoHideBehavior behavior,
- aura::RootWindow* root_window) OVERRIDE;
+ // Gets the shelf auto-hide behavior on |root_window|.
+ virtual ash::ShelfAutoHideBehavior GetShelfAutoHideBehavior(
+ aura::RootWindow* root_window) const OVERRIDE;
+
+ // Returns |true| if the user is allowed to modify the shelf auto-hide
+ // behavior on |root_window|.
+ virtual bool CanUserModifyShelfAutoHideBehavior(
+ aura::RootWindow* root_window) const OVERRIDE;
+
+ // Toggles the shelf auto-hide behavior on |root_window|. Does nothing if the
+ // user is not allowed to modify the auto-hide behavior.
+ virtual void ToggleShelfAutoHideBehavior(
+ aura::RootWindow* root_window) OVERRIDE;
// The tab no longer represents its previously identified application.
virtual void RemoveTabFromRunningApp(TabContents* tab,
@@ -283,6 +294,10 @@ class ChromeLauncherControllerPerBrowser
// Re-syncs launcher model with prefs::kPinnedLauncherApps.
void UpdateAppLaunchersFromPref();
+ // Persists the shelf auto-hide behavior to prefs.
+ void SetShelfAutoHideBehaviorPrefs(ash::ShelfAutoHideBehavior behavior,
+ aura::RootWindow* root_window);
+
// Sets the shelf auto-hide behavior from prefs.
void SetShelfAutoHideBehaviorFromPrefs();
diff --git a/chrome/browser/ui/ash/launcher/launcher_context_menu.cc b/chrome/browser/ui/ash/launcher/launcher_context_menu.cc
index d45b703..3e1b754 100644
--- a/chrome/browser/ui/ash/launcher/launcher_context_menu.cc
+++ b/chrome/browser/ui/ash/launcher/launcher_context_menu.cc
@@ -175,8 +175,8 @@ bool LauncherContextMenu::IsCommandIdChecked(int command_id) const {
return controller_->GetLaunchType(item_.id) ==
extensions::ExtensionPrefs::LAUNCH_FULLSCREEN;
case MENU_AUTO_HIDE:
- return ash::Shell::GetInstance()->IsShelfAutoHideMenuHideChecked(
- root_window_);
+ return controller_->GetShelfAutoHideBehavior(root_window_) ==
+ ash::SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS;
default:
return extension_items_->IsCommandIdChecked(command_id);
}
@@ -194,6 +194,8 @@ bool LauncherContextMenu::IsCommandIdEnabled(int command_id) const {
// "Normal" windows are not allowed when incognito is enforced.
return IncognitoModePrefs::GetAvailability(
controller_->profile()->GetPrefs()) != IncognitoModePrefs::FORCED;
+ case MENU_AUTO_HIDE:
+ return controller_->CanUserModifyShelfAutoHideBehavior(root_window_);
case MENU_NEW_INCOGNITO_WINDOW:
// Incognito windows are not allowed when incognito is disabled.
return IncognitoModePrefs::GetAvailability(
@@ -237,10 +239,7 @@ void LauncherContextMenu::ExecuteCommand(int command_id) {
extensions::ExtensionPrefs::LAUNCH_FULLSCREEN);
break;
case MENU_AUTO_HIDE:
- controller_->SetAutoHideBehavior(
- ash::Shell::GetInstance()->GetToggledShelfAutoHideBehavior(
- root_window_),
- root_window_);
+ controller_->ToggleShelfAutoHideBehavior(root_window_);
break;
case MENU_NEW_WINDOW:
controller_->CreateNewWindow();
diff --git a/chrome/test/data/policy/policy_test_cases.json b/chrome/test/data/policy/policy_test_cases.json
index 17590f1..02d27a6 100644
--- a/chrome/test/data/policy/policy_test_cases.json
+++ b/chrome/test/data/policy/policy_test_cases.json
@@ -1495,6 +1495,14 @@
]
},
+ "ShelfAutoHideBehavior": {
+ "os": ["chromeos"],
+ "test_policy": { "ShelfAutoHideBehavior": "Always" },
+ "pref_mappings": [
+ { "pref": "auto_hide_behavior_local" }
+ ]
+ },
+
"----- Chrome OS device policies ---------------------------------------": {},
"DevicePolicyRefreshRate": {