diff options
author | bartfab@chromium.org <bartfab@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-12-04 13:00:35 +0000 |
---|---|---|
committer | bartfab@chromium.org <bartfab@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-12-04 13:00:35 +0000 |
commit | 54b1a85e62edf9ac99afa0802f20002a1d487940 (patch) | |
tree | 8bd2e2698868ae26220594c6945fd42604135708 | |
parent | 903d70ae6d3c46369394c0ada5ba45bc705e5e8f (diff) | |
download | chromium_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.cc | 11 | ||||
-rw-r--r-- | ash/root_window_controller.h | 4 | ||||
-rw-r--r-- | ash/shell.cc | 11 | ||||
-rw-r--r-- | ash/shell.h | 4 | ||||
-rw-r--r-- | ash/shell/context_menu.cc | 11 | ||||
-rw-r--r-- | ash/shell_unittest.cc | 37 | ||||
-rw-r--r-- | ash/wm/shelf_layout_manager.h | 2 | ||||
-rw-r--r-- | chrome/app/policy/policy_templates.json | 42 | ||||
-rw-r--r-- | chrome/browser/policy/configuration_policy_handler_list.cc | 3 | ||||
-rw-r--r-- | chrome/browser/ui/ash/launcher/chrome_launcher_controller.h | 14 | ||||
-rw-r--r-- | chrome/browser/ui/ash/launcher/chrome_launcher_controller_per_app.cc | 112 | ||||
-rw-r--r-- | chrome/browser/ui/ash/launcher/chrome_launcher_controller_per_app.h | 19 | ||||
-rw-r--r-- | chrome/browser/ui/ash/launcher/chrome_launcher_controller_per_browser.cc | 113 | ||||
-rw-r--r-- | chrome/browser/ui/ash/launcher/chrome_launcher_controller_per_browser.h | 19 | ||||
-rw-r--r-- | chrome/browser/ui/ash/launcher/launcher_context_menu.cc | 11 | ||||
-rw-r--r-- | chrome/test/data/policy/policy_test_cases.json | 8 |
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": { |