cros: Trigger immersive mode with F4 maximize key

This is a UI experiment that may be reverted for M26 depending on feedback.

* Ensure ImmersiveModeController always watches for window property changes.
* Trigger immersive mode in ChromeShellDelegate (this is only triggered by F4)
* Ensure we hide the immersive mode button when window isn't maximized (there
  are ordering issues with the window observers for show state that exit
  immersive mode vs. hide the button)

BUG=170167
TEST=added to browser_tests ImmersiveModeController.*


Review URL: https://chromiumcodereview.appspot.com/11969006

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@177194 0039d316-1c4b-4281-b951-d872f2087c98
parent 483692b1
......@@ -9,6 +9,7 @@
#include "ash/magnifier/magnifier_constants.h"
#include "ash/system/tray/system_tray_delegate.h"
#include "ash/wm/stacking_controller.h"
#include "ash/wm/window_properties.h"
#include "ash/wm/window_util.h"
#include "base/bind.h"
#include "base/command_line.h"
......@@ -207,6 +208,10 @@ void ChromeShellDelegate::ToggleMaximized() {
return;
}
ash::wm::ToggleMaximizedWindow(window);
// Experiment with automatically entering immersive mode when the user presses
// the F4 maximize key.
window->SetProperty(ash::internal::kImmersiveModeKey,
ash::wm::IsWindowMaximized(window));
}
void ChromeShellDelegate::OpenFileManager() {
......
......@@ -202,10 +202,17 @@ void BrowserNonClientFrameViewAsh::ResetWindowControls() {
// Only show them during a reveal.
ImmersiveModeController* controller =
browser_view()->immersive_mode_controller();
bool show_buttons = !controller->enabled() || controller->IsRevealed();
immersive_button_->SetVisible(show_buttons);
size_button_->SetVisible(show_buttons);
close_button_->SetVisible(show_buttons);
if (controller->enabled()) {
bool revealed = controller->IsRevealed();
immersive_button_->SetVisible(revealed);
size_button_->SetVisible(revealed);
close_button_->SetVisible(revealed);
} else {
// Only show immersive button for maximized windows.
immersive_button_->SetVisible(frame()->IsMaximized());
size_button_->SetVisible(true);
close_button_->SetVisible(true);
}
size_button_->SetState(views::CustomButton::STATE_NORMAL);
// The close button isn't affected by this constraint.
......
......@@ -244,11 +244,20 @@ class ImmersiveModeController::WindowObserver : public aura::WindowObserver {
const void* key,
intptr_t old) OVERRIDE {
using aura::client::kShowStateKey;
if (key != kShowStateKey)
return;
// Disable immersive mode when leaving the maximized state.
if (window->GetProperty(kShowStateKey) != ui::SHOW_STATE_MAXIMIZED)
controller_->SetEnabled(false);
if (key == kShowStateKey) {
// Disable immersive mode when leaving the maximized state.
if (window->GetProperty(kShowStateKey) != ui::SHOW_STATE_MAXIMIZED)
controller_->SetEnabled(false);
return;
}
#if defined(USE_ASH)
using ash::internal::kImmersiveModeKey;
if (key == kImmersiveModeKey) {
// Another component has toggled immersive mode.
controller_->SetEnabled(window->GetProperty(kImmersiveModeKey));
return;
}
#endif
}
private:
......@@ -280,6 +289,7 @@ void ImmersiveModeController::Init() {
// window pointer so |this| can stop observing during destruction.
native_window_ = browser_view_->GetNativeWindow();
DCHECK(native_window_);
EnableWindowObservers(true);
#if defined(USE_ASH)
// Optionally allow the tab indicators to be hidden.
......@@ -302,6 +312,7 @@ void ImmersiveModeController::SetEnabled(bool enabled) {
}
#if defined(USE_ASH)
// This causes a no-op call to SetEnabled() since enabled_ is already set.
native_window_->SetProperty(ash::internal::kImmersiveModeKey, enabled_);
// Ash on Windows may not have a shell.
if (ash::Shell::HasInstance()) {
......@@ -317,8 +328,6 @@ void ImmersiveModeController::SetEnabled(bool enabled) {
// Always ensure tab strip is in correct state.
browser_view_->tabstrip()->SetImmersiveStyle(enabled_);
browser_view_->Layout();
EnableWindowObservers(enabled_);
}
views::View* ImmersiveModeController::reveal_view() {
......@@ -347,7 +356,7 @@ void ImmersiveModeController::CancelReveal() {
// ui::EventHandler overrides:
void ImmersiveModeController::OnMouseEvent(ui::MouseEvent* event) {
if (event->type() != ui::ET_MOUSE_MOVED)
if (!enabled_ || event->type() != ui::ET_MOUSE_MOVED)
return;
if (event->location().y() == 0) {
// Start a reveal if the mouse touches the top of the screen and then stops
......
......@@ -17,6 +17,7 @@
#include "ash/shelf_types.h"
#include "ash/shell.h"
#include "ash/wm/shelf_layout_manager.h"
#include "ash/wm/window_properties.h"
#endif
namespace {
......@@ -182,8 +183,8 @@ IN_PROC_BROWSER_TEST_F(ImmersiveModeControllerTest, MAYBE_ImmersiveMode) {
}
#if defined(USE_ASH)
// Test shelf auto-hide toggling behavior.
IN_PROC_BROWSER_TEST_F(ImmersiveModeControllerTest, ImmersiveShelf) {
// Ash-specific immersive mode tests.
IN_PROC_BROWSER_TEST_F(ImmersiveModeControllerTest, ImmersiveAsh) {
#if defined(OS_WIN)
// Not running in Ash, so this doesn't doesn't make sense.
if (!ash::Shell::HasInstance())
......@@ -220,5 +221,13 @@ IN_PROC_BROWSER_TEST_F(ImmersiveModeControllerTest, ImmersiveShelf) {
// Disabling immersive mode maintains the user's auto-hide selection.
immersive_controller->SetEnabled(false);
EXPECT_EQ(ash::SHELF_AUTO_HIDE, shelf->visibility_state());
// Setting the window property directly toggles immersive mode.
aura::Window* window = browser_view->GetWidget()->GetNativeWindow();
window->SetProperty(ash::internal::kImmersiveModeKey, true);
EXPECT_TRUE(immersive_controller->enabled());
window->SetProperty(ash::internal::kImmersiveModeKey, false);
EXPECT_FALSE(immersive_controller->enabled());
}
#endif // defined(OS_CHROMEOS)
#endif // defined(USE_ASH)
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment