diff options
26 files changed, 252 insertions, 126 deletions
diff --git a/ash/accelerators/accelerator_commands.cc b/ash/accelerators/accelerator_commands.cc index 73f1b1a..003562e 100644 --- a/ash/accelerators/accelerator_commands.cc +++ b/ash/accelerators/accelerator_commands.cc @@ -37,10 +37,16 @@ void ToggleMaximized() { return; // Get out of fullscreen when in fullscreen mode. if (window_state->IsFullscreen()) - Shell::GetInstance()->delegate()->ToggleFullscreen(); + ToggleFullscreen(); else window_state->ToggleMaximized(); } +void ToggleFullscreen() { + wm::WindowState* window_state = wm::GetActiveWindowState(); + if (window_state) + window_state->ToggleFullscreen(); +} + } // namespace accelerators } // namespace ash diff --git a/ash/accelerators/accelerator_commands.h b/ash/accelerators/accelerator_commands.h index 36006e7..df576ba 100644 --- a/ash/accelerators/accelerator_commands.h +++ b/ash/accelerators/accelerator_commands.h @@ -21,6 +21,10 @@ ASH_EXPORT bool ToggleMinimized(); // fullscreen mode. ASH_EXPORT void ToggleMaximized(); +// Toggles the fullscreen state. The behavior can be overridden +// by WindowStateDelegate::ToggleFullscreen(). +ASH_EXPORT void ToggleFullscreen(); + } // namespace accelerators } // namespace ash diff --git a/ash/accelerators/accelerator_commands_unittest.cc b/ash/accelerators/accelerator_commands_unittest.cc index 2423bb5..c193b26 100644 --- a/ash/accelerators/accelerator_commands_unittest.cc +++ b/ash/accelerators/accelerator_commands_unittest.cc @@ -8,6 +8,12 @@ #include "ash/wm/window_state.h" #include "ui/aura/window.h" +// Note: The unit tests for |ToggleMaximized()| and +// |ToggleFullscreen()| are in +// chrome/browser/ui/ash/accelerator_commands_browsertests.cc. +// because they depends on chrome implementation of +// |ash::wm::WindowStateDelegate|. + namespace ash { namespace accelerators { diff --git a/ash/accelerators/accelerator_controller.cc b/ash/accelerators/accelerator_controller.cc index 052baaa..b7f95a7 100644 --- a/ash/accelerators/accelerator_controller.cc +++ b/ash/accelerators/accelerator_controller.cc @@ -849,7 +849,7 @@ bool AcceleratorController::PerformAction(int action, shell->delegate()->RecordUserMetricsAction( UMA_ACCEL_FULLSCREEN_F4); } - shell->delegate()->ToggleFullscreen(); + accelerators::ToggleFullscreen(); return true; } case TOGGLE_MAXIMIZED: { diff --git a/ash/ash.gyp b/ash/ash.gyp index 99e51f6..99e8489 100644 --- a/ash/ash.gyp +++ b/ash/ash.gyp @@ -540,6 +540,8 @@ 'wm/window_positioner.h', 'wm/window_state.cc', 'wm/window_state.h', + 'wm/window_state_delegate.cc', + 'wm/window_state_delegate.h', 'wm/window_state_observer.h', 'wm/window_properties.cc', 'wm/window_properties.h', diff --git a/ash/shell/shell_delegate_impl.cc b/ash/shell/shell_delegate_impl.cc index 717d07d..e1ca903 100644 --- a/ash/shell/shell_delegate_impl.cc +++ b/ash/shell/shell_delegate_impl.cc @@ -89,13 +89,6 @@ void ShellDelegateImpl::Exit() { base::MessageLoopForUI::current()->Quit(); } -void ShellDelegateImpl::ToggleFullscreen() { - // TODO(oshima): Remove this when crbug.com/309837 is implemented. - wm::WindowState* window_state = wm::GetActiveWindowState(); - if (window_state) - window_state->ToggleMaximized(); -} - keyboard::KeyboardControllerProxy* ShellDelegateImpl::CreateKeyboardControllerProxy() { return new KeyboardControllerProxyStub(); diff --git a/ash/shell/shell_delegate_impl.h b/ash/shell/shell_delegate_impl.h index 35f46ff..647331e 100644 --- a/ash/shell/shell_delegate_impl.h +++ b/ash/shell/shell_delegate_impl.h @@ -33,7 +33,6 @@ class ShellDelegateImpl : public ash::ShellDelegate { virtual void PreInit() OVERRIDE; virtual void Shutdown() OVERRIDE; virtual void Exit() OVERRIDE; - virtual void ToggleFullscreen() OVERRIDE; virtual keyboard::KeyboardControllerProxy* CreateKeyboardControllerProxy() OVERRIDE; virtual content::BrowserContext* GetCurrentBrowserContext() OVERRIDE; diff --git a/ash/shell_delegate.h b/ash/shell_delegate.h index 6cd0baa..1023689 100644 --- a/ash/shell_delegate.h +++ b/ash/shell_delegate.h @@ -129,9 +129,6 @@ class ASH_EXPORT ShellDelegate { // Invoked when the user uses Ctrl-Shift-Q to close chrome. virtual void Exit() = 0; - // Invoked when the user uses Shift+F4 to toggle the window fullscreen state. - virtual void ToggleFullscreen() = 0; - // Create a shell-specific keyboard::KeyboardControllerProxy virtual keyboard::KeyboardControllerProxy* CreateKeyboardControllerProxy() = 0; diff --git a/ash/test/test_shell_delegate.cc b/ash/test/test_shell_delegate.cc index 7676e42..a882f87 100644 --- a/ash/test/test_shell_delegate.cc +++ b/ash/test/test_shell_delegate.cc @@ -72,9 +72,6 @@ void TestShellDelegate::Exit() { num_exit_requests_++; } -void TestShellDelegate::ToggleFullscreen() { -} - keyboard::KeyboardControllerProxy* TestShellDelegate::CreateKeyboardControllerProxy() { return new KeyboardControllerProxyStub(); diff --git a/ash/test/test_shell_delegate.h b/ash/test/test_shell_delegate.h index 98ffca41..47c268d 100644 --- a/ash/test/test_shell_delegate.h +++ b/ash/test/test_shell_delegate.h @@ -36,7 +36,6 @@ class TestShellDelegate : public ShellDelegate { virtual void PreInit() OVERRIDE; virtual void Shutdown() OVERRIDE; virtual void Exit() OVERRIDE; - virtual void ToggleFullscreen() OVERRIDE; virtual keyboard::KeyboardControllerProxy* CreateKeyboardControllerProxy() OVERRIDE; virtual content::BrowserContext* GetCurrentBrowserContext() OVERRIDE; diff --git a/ash/wm/window_properties.cc b/ash/wm/window_properties.cc index 1423950..ced25b2 100644 --- a/ash/wm/window_properties.cc +++ b/ash/wm/window_properties.cc @@ -11,7 +11,6 @@ DECLARE_WINDOW_PROPERTY_TYPE(ash::wm::WindowState*); namespace ash { namespace internal { -DEFINE_WINDOW_PROPERTY_KEY(bool, kAnimateToFullscreenKey, true); DEFINE_WINDOW_PROPERTY_KEY(bool, kStayInSameRootWindowKey, false); DEFINE_WINDOW_PROPERTY_KEY(bool, kUsesScreenCoordinatesKey, false); DEFINE_OWNED_WINDOW_PROPERTY_KEY(wm::WindowState, diff --git a/ash/wm/window_properties.h b/ash/wm/window_properties.h index 9f13fad..74ae495 100644 --- a/ash/wm/window_properties.h +++ b/ash/wm/window_properties.h @@ -25,10 +25,6 @@ namespace internal { // Alphabetical sort. -// A property key to suppress the cross-fade animation for the transition to -// the fullscreen state. -extern const aura::WindowProperty<bool>* const kAnimateToFullscreenKey; - // If this is set to true, the window stays in the same root window // even if the bounds outside of its root window is set. // This is exported as it's used in the tests. diff --git a/ash/wm/window_state.cc b/ash/wm/window_state.cc index c441524..b3448e9 100644 --- a/ash/wm/window_state.cc +++ b/ash/wm/window_state.cc @@ -8,6 +8,7 @@ #include "ash/screen_ash.h" #include "ash/shell_window_ids.h" #include "ash/wm/window_properties.h" +#include "ash/wm/window_state_delegate.h" #include "ash/wm/window_state_observer.h" #include "ash/wm/window_util.h" #include "ash/wm/wm_types.h" @@ -39,6 +40,7 @@ WindowState::WindowState(aura::Window* window) window_resizer_(NULL), always_restores_to_restore_bounds_(false), hide_shelf_when_fullscreen_(true), + animate_to_fullscreen_(true), window_show_type_(ToWindowShowType(GetShowState())) { window_->AddObserver(this); } @@ -46,6 +48,11 @@ WindowState::WindowState(aura::Window* window) WindowState::~WindowState() { } +void WindowState::SetDelegate(scoped_ptr<WindowStateDelegate> delegate) { + DCHECK(!delegate_.get()); + delegate_ = delegate.Pass(); +} + ui::WindowShowState WindowState::GetShowState() const { return window_->GetProperty(aura::client::kShowStateKey); } @@ -161,6 +168,22 @@ void WindowState::ToggleMaximized() { Maximize(); } +void WindowState::ToggleFullscreen() { + // Window which cannot be maximized should not be fullscreened. + // It can, however, be restored if it was fullscreened. + bool is_fullscreen = IsFullscreen(); + if (!is_fullscreen && !CanMaximize()) + return; + if (delegate_ && delegate_->ToggleFullscreen(this)) + return; + if (is_fullscreen) { + Restore(); + } else { + window_->SetProperty(aura::client::kShowStateKey, + ui::SHOW_STATE_FULLSCREEN); + } +} + void WindowState::SetBoundsInScreen( const gfx::Rect& bounds_in_screen) { gfx::Rect bounds_in_parent = diff --git a/ash/wm/window_state.h b/ash/wm/window_state.h index 560a91f..320977e 100644 --- a/ash/wm/window_state.h +++ b/ash/wm/window_state.h @@ -25,6 +25,7 @@ namespace ash { class WindowResizer; namespace wm { +class WindowStateDelegate; class WindowStateObserver; // WindowState manages and defines ash specific window state and @@ -48,6 +49,8 @@ class ASH_EXPORT WindowState : public aura::WindowObserver { aura::Window* window() { return window_; } const aura::Window* window() const { return window_; } + void SetDelegate(scoped_ptr<WindowStateDelegate> delegate); + // Returns the window's current show state. ui::WindowShowState GetShowState() const; @@ -84,6 +87,7 @@ class ASH_EXPORT WindowState : public aura::WindowObserver { void Deactivate(); void Restore(); void ToggleMaximized(); + void ToggleFullscreen(); void SnapLeft(const gfx::Rect& bounds); void SnapRight(const gfx::Rect& bounds); @@ -135,6 +139,15 @@ class ASH_EXPORT WindowState : public aura::WindowObserver { hide_shelf_when_fullscreen_ = value; } + // Sets/gets the flag to suppress the cross-fade animation for + // the transition to the fullscreen state. + bool animate_to_fullscreen() const { + return animate_to_fullscreen_; + } + void set_animate_to_fullscreen(bool value) { + animate_to_fullscreen_ = value; + } + // Gets/Sets the bounds of the window before it was moved by the auto window // management. As long as it was not auto-managed, it will return NULL. const gfx::Rect* pre_auto_manage_window_bounds() const { @@ -234,6 +247,7 @@ class ASH_EXPORT WindowState : public aura::WindowObserver { // The owner of this window settings. aura::Window* window_; + scoped_ptr<WindowStateDelegate> delegate_; bool tracked_by_workspace_; bool window_position_managed_; @@ -247,6 +261,7 @@ class ASH_EXPORT WindowState : public aura::WindowObserver { bool always_restores_to_restore_bounds_; bool hide_shelf_when_fullscreen_; + bool animate_to_fullscreen_; // A property to remember the window position which was set before the // auto window position manager changed the window bounds, so that it can get diff --git a/ash/wm/window_state_delegate.cc b/ash/wm/window_state_delegate.cc new file mode 100644 index 0000000..0004073 --- /dev/null +++ b/ash/wm/window_state_delegate.cc @@ -0,0 +1,21 @@ +// Copyright 2013 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 "ash/wm/window_state_delegate.h" + +namespace ash { +namespace wm { + +WindowStateDelegate::WindowStateDelegate() { +} + +WindowStateDelegate::~WindowStateDelegate() { +} + +bool WindowStateDelegate::ToggleFullscreen(WindowState* window_state) { + return false; +} + +} // namespace wm +} // namespace ash diff --git a/ash/wm/window_state_delegate.h b/ash/wm/window_state_delegate.h new file mode 100644 index 0000000..7b9a8ba --- /dev/null +++ b/ash/wm/window_state_delegate.h @@ -0,0 +1,32 @@ +// Copyright 2013 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 ASH_WM_WINDOW_STATE_DELEGATE_H_ +#define ASH_WM_WINDOW_STATE_DELEGATE_H_ + +#include "ash/ash_export.h" +#include "base/basictypes.h" + +namespace ash { +namespace wm { +class WindowState; + +class ASH_EXPORT WindowStateDelegate { + public: + WindowStateDelegate(); + virtual ~WindowStateDelegate(); + + // Invoked when the user uses Shift+F4/F4 to toggle the window + // fullscreen state. The caller (ash::wm::WindowState) falls backs + // to the default implementation if this returns false. + virtual bool ToggleFullscreen(WindowState* window_state); + + private: + DISALLOW_COPY_AND_ASSIGN(WindowStateDelegate); +}; + +} // namespace wm +} // namespace ash + +#endif // ASH_WM_WINDOW_STATE_DELEGATE_H_ diff --git a/ash/wm/window_util.cc b/ash/wm/window_util.cc index 7f35840..46a776a 100644 --- a/ash/wm/window_util.cc +++ b/ash/wm/window_util.cc @@ -62,10 +62,6 @@ void CenterWindow(aura::Window* window) { window->SetBoundsInScreen(center, display); } -void SetAnimateToFullscreen(aura::Window* window, bool animate) { - window->SetProperty(ash::internal::kAnimateToFullscreenKey, animate); -} - void AdjustBoundsToEnsureMinimumWindowVisibility(const gfx::Rect& visible_area, gfx::Rect* bounds) { AdjustBoundsToEnsureWindowVisibility( diff --git a/ash/wm/window_util.h b/ash/wm/window_util.h index fd71a0b..fb12959 100644 --- a/ash/wm/window_util.h +++ b/ash/wm/window_util.h @@ -47,9 +47,6 @@ ASH_EXPORT bool IsWindowMinimized(aura::Window* window); // Moves the window to the center of the display. ASH_EXPORT void CenterWindow(aura::Window* window); -// Change the availability of animation to the fullscreen of the |window|. -ASH_EXPORT void SetAnimateToFullscreen(aura::Window* window, bool animate); - // Move the given bounds inside the given |visible_area| in parent coordinates, // including a safety margin given by |kMinimumOnScreenArea|. // This also ensures that the top of the bounds is visible. diff --git a/ash/wm/workspace/workspace_layout_manager.cc b/ash/wm/workspace/workspace_layout_manager.cc index cfe77ff..513ea19 100644 --- a/ash/wm/workspace/workspace_layout_manager.cc +++ b/ash/wm/workspace/workspace_layout_manager.cc @@ -349,7 +349,7 @@ void WorkspaceLayoutManager::UpdateBoundsFromShowState( MoveToDisplayForRestore(window_state); gfx::Rect new_bounds = ScreenAsh::GetDisplayBoundsInParent( window->parent()->parent()); - if (window->GetProperty(kAnimateToFullscreenKey) && + if (window_state->animate_to_fullscreen() && last_show_state != ui::SHOW_STATE_MINIMIZED) { CrossFadeToBounds(window, new_bounds); } else { diff --git a/chrome/browser/ui/ash/chrome_shell_delegate_browsertest.cc b/chrome/browser/ui/ash/accelerator_commands_browsertest.cc index 6d30bb7..0e80762 100644 --- a/chrome/browser/ui/ash/chrome_shell_delegate_browsertest.cc +++ b/chrome/browser/ui/ash/accelerator_commands_browsertest.cc @@ -1,15 +1,12 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// Copyright 2013 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/ui/ash/chrome_shell_delegate.h" +#include "ash/accelerators/accelerator_commands.h" #include "apps/shell_window.h" #include "apps/ui/native_app_window.h" -#include "ash/accelerators/accelerator_commands.h" -#include "ash/ash_switches.h" #include "ash/shell.h" -#include "ash/shell_delegate.h" #include "ash/wm/window_state.h" #include "base/command_line.h" #include "chrome/browser/apps/app_browsertest_util.h" @@ -36,15 +33,11 @@ bool IsInImmersiveFullscreen(BrowserWindow* browser_window) { } // namespace -typedef InProcessBrowserTest ChromeShellDelegateBrowserTest; - -// TODO(oshima): Move these tests to ash once ToggleFullscreen is moved -// to ash. crbug.com/309837. +typedef InProcessBrowserTest AcceleratorCommandsBrowserTest; // Confirm that toggling window miximized works properly -IN_PROC_BROWSER_TEST_F(ChromeShellDelegateBrowserTest, ToggleMaximized) { - ash::ShellDelegate* shell_delegate = ash::Shell::GetInstance()->delegate(); - ASSERT_TRUE(shell_delegate); +IN_PROC_BROWSER_TEST_F(AcceleratorCommandsBrowserTest, ToggleMaximized) { + ASSERT_TRUE(ash::Shell::HasInstance()) << "No Instance"; ash::wm::WindowState* window_state = ash::wm::GetActiveWindowState(); ASSERT_TRUE(window_state); @@ -70,10 +63,8 @@ IN_PROC_BROWSER_TEST_F(ChromeShellDelegateBrowserTest, ToggleMaximized) { } // Confirm that toggling window fullscren works properly. -IN_PROC_BROWSER_TEST_F(ChromeShellDelegateBrowserTest, ToggleFullscreen) { - ash::ShellDelegate* shell_delegate = ash::Shell::GetInstance()->delegate(); - ASSERT_TRUE(shell_delegate); - +IN_PROC_BROWSER_TEST_F(AcceleratorCommandsBrowserTest, ToggleFullscreen) { + ASSERT_TRUE(ash::Shell::HasInstance()) << "No Instance"; // 1) ToggleFullscreen() should toggle whether a tabbed browser window is in // immersive fullscreen. ASSERT_TRUE(browser()->is_type_tabbed()); @@ -82,11 +73,11 @@ IN_PROC_BROWSER_TEST_F(ChromeShellDelegateBrowserTest, ToggleFullscreen) { EXPECT_FALSE(browser_window->IsMaximized()); EXPECT_FALSE(browser_window->IsFullscreen()); - shell_delegate->ToggleFullscreen(); + ash::accelerators::ToggleFullscreen(); EXPECT_TRUE(browser_window->IsFullscreen()); EXPECT_TRUE(IsInImmersiveFullscreen(browser_window)); - shell_delegate->ToggleFullscreen(); + ash::accelerators::ToggleFullscreen(); EXPECT_FALSE(browser_window->IsMaximized()); EXPECT_FALSE(browser_window->IsFullscreen()); @@ -94,7 +85,7 @@ IN_PROC_BROWSER_TEST_F(ChromeShellDelegateBrowserTest, ToggleFullscreen) { // maximized. browser_window->GetNativeWindow()->SetProperty(aura::client::kCanMaximizeKey, false); - shell_delegate->ToggleFullscreen(); + ash::accelerators::ToggleFullscreen(); EXPECT_FALSE(browser_window->IsMaximized()); EXPECT_FALSE(browser_window->IsFullscreen()); @@ -117,10 +108,10 @@ IN_PROC_BROWSER_TEST_F(ChromeShellDelegateBrowserTest, ToggleFullscreen) { EXPECT_FALSE(browser_window->IsMaximized()); EXPECT_FALSE(browser_window->IsFullscreen()); - shell_delegate->ToggleFullscreen(); + ash::accelerators::ToggleFullscreen(); EXPECT_TRUE(browser_window->IsMaximized()); - shell_delegate->ToggleFullscreen(); + ash::accelerators::ToggleFullscreen(); EXPECT_FALSE(browser_window->IsMaximized()); EXPECT_FALSE(browser_window->IsFullscreen()); @@ -136,11 +127,11 @@ IN_PROC_BROWSER_TEST_F(ChromeShellDelegateBrowserTest, ToggleFullscreen) { EXPECT_FALSE(browser_window->IsMaximized()); EXPECT_FALSE(browser_window->IsFullscreen()); - shell_delegate->ToggleFullscreen(); + ash::accelerators::ToggleFullscreen(); EXPECT_TRUE(browser_window->IsFullscreen()); EXPECT_FALSE(IsInImmersiveFullscreen(browser_window)); - shell_delegate->ToggleFullscreen(); + ash::accelerators::ToggleFullscreen(); EXPECT_FALSE(browser_window->IsMaximized()); EXPECT_FALSE(browser_window->IsFullscreen()); @@ -156,24 +147,22 @@ IN_PROC_BROWSER_TEST_F(ChromeShellDelegateBrowserTest, ToggleFullscreen) { EXPECT_FALSE(browser_window->IsMaximized()); EXPECT_FALSE(browser_window->IsFullscreen()); - shell_delegate->ToggleFullscreen(); + ash::accelerators::ToggleFullscreen(); EXPECT_TRUE(browser_window->IsFullscreen()); EXPECT_FALSE(IsInImmersiveFullscreen(browser_window)); - shell_delegate->ToggleFullscreen(); + ash::accelerators::ToggleFullscreen(); EXPECT_FALSE(browser_window->IsMaximized()); EXPECT_FALSE(browser_window->IsFullscreen()); } typedef extensions::PlatformAppBrowserTest - ChromeShellDelegatePlatformAppBrowserTest; + AcceleratorCommandsPlatformAppBrowserTest; // Test that ToggleFullscreen() toggles the platform app's fullscreen state. -IN_PROC_BROWSER_TEST_F(ChromeShellDelegatePlatformAppBrowserTest, +IN_PROC_BROWSER_TEST_F(AcceleratorCommandsPlatformAppBrowserTest, ToggleFullscreenPlatformApp) { - ash::ShellDelegate* shell_delegate = ash::Shell::GetInstance()->delegate(); - ASSERT_TRUE(shell_delegate); - + ASSERT_TRUE(ash::Shell::HasInstance()) << "No Instance"; const extensions::Extension* extension = LoadAndLaunchPlatformApp("minimal"); apps::ShellWindow* shell_window = CreateShellWindow(extension); apps::NativeAppWindow* app_window = shell_window->GetBaseWindow(); @@ -181,10 +170,10 @@ IN_PROC_BROWSER_TEST_F(ChromeShellDelegatePlatformAppBrowserTest, EXPECT_FALSE(app_window->IsMaximized()); EXPECT_FALSE(app_window->IsFullscreen()); - shell_delegate->ToggleFullscreen(); + ash::accelerators::ToggleFullscreen(); EXPECT_TRUE(app_window->IsFullscreen()); - shell_delegate->ToggleFullscreen(); + ash::accelerators::ToggleFullscreen(); EXPECT_FALSE(app_window->IsMaximized()); EXPECT_FALSE(app_window->IsFullscreen()); diff --git a/chrome/browser/ui/ash/chrome_shell_delegate.cc b/chrome/browser/ui/ash/chrome_shell_delegate.cc index d8e579e..6447983 100644 --- a/chrome/browser/ui/ash/chrome_shell_delegate.cc +++ b/chrome/browser/ui/ash/chrome_shell_delegate.cc @@ -21,7 +21,6 @@ #include "chrome/browser/ui/ash/launcher/launcher_context_menu.h" #include "chrome/browser/ui/ash/user_action_handler.h" #include "chrome/browser/ui/browser_commands.h" -#include "chrome/browser/ui/browser_finder.h" #include "chrome/common/chrome_switches.h" #include "content/public/browser/user_metrics.h" #include "grit/chromium_strings.h" @@ -87,55 +86,6 @@ void ChromeShellDelegate::Exit() { chrome::AttemptUserExit(); } -void ChromeShellDelegate::ToggleFullscreen() { - // Only toggle if the user has a window open. - aura::Window* window = ash::wm::GetActiveWindow(); - if (!window) - return; - ash::wm::WindowState* window_state = ash::wm::GetWindowState(window); - - bool is_fullscreen = window_state->IsFullscreen(); - - // Windows which cannot be maximized should not be fullscreened. - if (!is_fullscreen && !window_state->CanMaximize()) - return; - - Browser* browser = chrome::FindBrowserWithWindow(window); - if (browser) { - // If a window is fullscreen, exit fullscreen. - if (is_fullscreen) { - chrome::ToggleFullscreenMode(browser); - return; - } - - // AppNonClientFrameViewAsh shows only the window controls and no other - // window decorations which is pretty close to fullscreen. Put v1 apps - // into maximized mode instead of fullscreen to avoid showing the ugly - // fullscreen exit bubble. -#if defined(OS_WIN) - if (browser->host_desktop_type() == chrome::HOST_DESKTOP_TYPE_NATIVE) { - chrome::ToggleFullscreenMode(browser); - return; - } -#endif // OS_WIN - if (browser->is_app() && browser->app_type() != Browser::APP_TYPE_CHILD) - window_state->ToggleMaximized(); - else - chrome::ToggleFullscreenMode(browser); - return; - } - - // |window| may belong to a shell window. - apps::ShellWindow* shell_window = apps::ShellWindowRegistry:: - GetShellWindowForNativeWindowAnyProfile(window); - if (shell_window) { - if (is_fullscreen) - shell_window->Restore(); - else - shell_window->Fullscreen(); - } -} - content::BrowserContext* ChromeShellDelegate::GetCurrentBrowserContext() { return ProfileManager::GetDefaultProfile(); } diff --git a/chrome/browser/ui/ash/chrome_shell_delegate.h b/chrome/browser/ui/ash/chrome_shell_delegate.h index 28b298d..b5af8a5 100644 --- a/chrome/browser/ui/ash/chrome_shell_delegate.h +++ b/chrome/browser/ui/ash/chrome_shell_delegate.h @@ -43,7 +43,6 @@ class ChromeShellDelegate : public ash::ShellDelegate, virtual void PreInit() OVERRIDE; virtual void Shutdown() OVERRIDE; virtual void Exit() OVERRIDE; - virtual void ToggleFullscreen() OVERRIDE; virtual keyboard::KeyboardControllerProxy* CreateKeyboardControllerProxy() OVERRIDE; virtual content::BrowserContext* GetCurrentBrowserContext() OVERRIDE; diff --git a/chrome/browser/ui/views/apps/native_app_window_views.cc b/chrome/browser/ui/views/apps/native_app_window_views.cc index 42a543b..ecdb65f 100644 --- a/chrome/browser/ui/views/apps/native_app_window_views.cc +++ b/chrome/browser/ui/views/apps/native_app_window_views.cc @@ -4,6 +4,7 @@ #include "chrome/browser/ui/views/apps/native_app_window_views.h" +#include "apps/shell_window.h" #include "apps/ui/views/shell_window_frame_view.h" #include "base/command_line.h" #include "base/file_util.h" @@ -13,6 +14,7 @@ #include "chrome/browser/extensions/extension_host.h" #include "chrome/browser/favicon/favicon_tab_helper.h" #include "chrome/browser/profiles/profile.h" +#include "chrome/browser/ui/host_desktop.h" #include "chrome/browser/ui/views/extensions/extension_keybinding_registry_views.h" #include "chrome/browser/web_applications/web_app.h" #include "chrome/common/chrome_switches.h" @@ -46,6 +48,7 @@ #include "ash/wm/custom_frame_view_ash.h" #include "ash/wm/panels/panel_frame_view.h" #include "ash/wm/window_state.h" +#include "ash/wm/window_state_delegate.h" #include "chrome/browser/ui/ash/ash_util.h" #include "ui/aura/client/aura_constants.h" #include "ui/aura/client/window_tree_client.h" @@ -124,6 +127,34 @@ void CreateIconAndSetRelaunchDetails( } #endif +#if defined(USE_ASH) +// This class handles a user's fullscreen request (Shift+F4/F4). +class NativeAppWindowStateDelegate : public ash::wm::WindowStateDelegate { + public: + explicit NativeAppWindowStateDelegate(ShellWindow* shell_window) + : shell_window_(shell_window) { + DCHECK(shell_window_); + } + virtual ~NativeAppWindowStateDelegate(){} + + // Overridden from ash::wm::WindowStateDelegate. + virtual bool ToggleFullscreen(ash::wm::WindowState* window_state) OVERRIDE { + // Windows which cannot be maximized should not be fullscreened. + DCHECK(window_state->IsFullscreen() || window_state->CanMaximize()); + if (window_state->IsFullscreen()) + shell_window_->Restore(); + else if (window_state->CanMaximize()) + shell_window_->Fullscreen(); + return true; + } + + private: + ShellWindow* shell_window_; // not owned. + + DISALLOW_COPY_AND_ASSIGN(NativeAppWindowStateDelegate); +}; +#endif // USE_ASH + } // namespace NativeAppWindowViews::NativeAppWindowViews( @@ -155,6 +186,14 @@ NativeAppWindowViews::NativeAppWindowViews( OnViewWasResized(); window_->AddObserver(this); +#if defined(USE_ASH) + if (chrome::GetHostDesktopTypeForNativeView(GetNativeWindow()) == + chrome::HOST_DESKTOP_TYPE_ASH) { + ash::wm::GetWindowState(GetNativeWindow())->SetDelegate( + scoped_ptr<ash::wm::WindowStateDelegate>( + new NativeAppWindowStateDelegate(shell_window)).Pass()); + } +#endif } NativeAppWindowViews::~NativeAppWindowViews() { diff --git a/chrome/browser/ui/views/frame/browser_frame_ash.cc b/chrome/browser/ui/views/frame/browser_frame_ash.cc index 07f4e33..d457dce 100644 --- a/chrome/browser/ui/views/frame/browser_frame_ash.cc +++ b/chrome/browser/ui/views/frame/browser_frame_ash.cc @@ -5,7 +5,10 @@ #include "chrome/browser/ui/views/frame/browser_frame_ash.h" #include "ash/wm/window_state.h" +#include "ash/wm/window_state_delegate.h" #include "ash/wm/window_util.h" +#include "chrome/browser/ui/browser_commands.h" +#include "chrome/browser/ui/browser_finder.h" #include "chrome/browser/ui/views/frame/browser_view.h" #include "ui/aura/client/aura_constants.h" #include "ui/aura/window.h" @@ -14,6 +17,64 @@ using aura::Window; +namespace { + +// BrowserWindowStateDelegate classe handles a user's fullscreen +// request (Shift+F4/F4) for browser (tabbed/popup) windows. +class BrowserWindowStateDelegate : public ash::wm::WindowStateDelegate { + public: + explicit BrowserWindowStateDelegate(Browser* browser) + : browser_(browser) { + DCHECK(browser_); + } + virtual ~BrowserWindowStateDelegate(){} + + // Overridden from ash::wm::WindowStateDelegate. + virtual bool ToggleFullscreen(ash::wm::WindowState* window_state) OVERRIDE { + DCHECK(window_state->IsFullscreen() || window_state->CanMaximize()); + // Windows which cannot be maximized should not be fullscreened. + if (!window_state->IsFullscreen() && !window_state->CanMaximize()) + return true; + chrome::ToggleFullscreenMode(browser_); + return true; + } + private: + Browser* browser_; // not owned. + + DISALLOW_COPY_AND_ASSIGN(BrowserWindowStateDelegate); +}; + +// AppNonClientFrameViewAsh shows only the window controls and no +// other window decorations which is pretty close to fullscreen. Put +// v1 apps into maximized mode instead of fullscreen to avoid showing +// the ugly fullscreen exit bubble. This is used for V1 apps. +class AppWindowStateDelegate : public ash::wm::WindowStateDelegate { + public: + explicit AppWindowStateDelegate(Browser* browser) + : browser_(browser) { + DCHECK(browser_); + } + virtual ~AppWindowStateDelegate(){} + + // Overridden from ash::wm::WindowStateDelegate. + virtual bool ToggleFullscreen(ash::wm::WindowState* window_state) OVERRIDE { + DCHECK(window_state->IsFullscreen() || window_state->CanMaximize()); + if (window_state->IsFullscreen()) + chrome::ToggleFullscreenMode(browser_); + else + window_state->ToggleMaximized(); + return true; + } + + private: + Browser* browser_; // not owned. + + DISALLOW_COPY_AND_ASSIGN(AppWindowStateDelegate); +}; + + +} // namespace + //////////////////////////////////////////////////////////////////////////////// // BrowserFrameAsh::WindowPropertyWatcher @@ -86,22 +147,29 @@ BrowserFrameAsh::BrowserFrameAsh(BrowserFrame* browser_frame, window_property_watcher_(new WindowPropertyWatcher(this, browser_frame)) { GetNativeWindow()->SetName(kWindowName); GetNativeWindow()->AddObserver(window_property_watcher_.get()); - if (browser_view->browser()->is_type_tabbed()) - ash::wm::SetAnimateToFullscreen(GetNativeWindow(), false); + Browser* browser = browser_view->browser(); + ash::wm::WindowState* window_state = + ash::wm::GetWindowState(GetNativeWindow()); + if (browser->is_app() && browser->app_type() != Browser::APP_TYPE_CHILD) { + window_state->SetDelegate( + scoped_ptr<ash::wm::WindowStateDelegate>( + new AppWindowStateDelegate(browser)).Pass()); + } else { + window_state->SetDelegate( + scoped_ptr<ash::wm::WindowStateDelegate>( + new BrowserWindowStateDelegate(browser)).Pass()); + } + window_state->set_animate_to_fullscreen(!browser->is_type_tabbed()); // Turn on auto window management if we don't need an explicit bounds. // This way the requested bounds are honored. - if (!browser_view->browser()->bounds_overridden() && - !browser_view->browser()->is_session_restore()) + if (!browser->bounds_overridden() && !browser->is_session_restore()) SetWindowAutoManaged(); #if defined(OS_CHROMEOS) // For legacy reasons v1 apps (like Secure Shell) are allowed to consume keys // like brightness, volume, etc. Otherwise these keys are handled by the // Ash window manager. - if (browser_view->browser()->is_app()) { - ash::wm::GetWindowState(GetNativeWindow())-> - set_can_consume_system_keys(true); - } + window_state->set_can_consume_system_keys(browser->is_app()); #endif // defined(OS_CHROMEOS) } diff --git a/chrome/browser/ui/views/tabs/tab_drag_controller.cc b/chrome/browser/ui/views/tabs/tab_drag_controller.cc index 136ae79..bb452ef 100644 --- a/chrome/browser/ui/views/tabs/tab_drag_controller.cc +++ b/chrome/browser/ui/views/tabs/tab_drag_controller.cc @@ -50,8 +50,7 @@ #include "ui/views/widget/widget.h" #if defined(USE_ASH) -#include "ash/shell.h" -#include "ash/shell_delegate.h" +#include "ash/accelerators/accelerator_commands.h" #include "ash/wm/coordinate_conversion.h" #include "ash/wm/window_state.h" #include "ui/aura/env.h" @@ -1911,7 +1910,7 @@ void TabDragController::CompleteDrag() { host_desktop_type_ == chrome::HOST_DESKTOP_TYPE_ASH) { // In fullscreen mode it is only possible to get here if the source // was in "immersive fullscreen" mode, so toggle it back on. - ash::Shell::GetInstance()->delegate()->ToggleFullscreen(); + ash::accelerators::ToggleFullscreen(); } #endif } else { diff --git a/chrome/chrome_tests.gypi b/chrome/chrome_tests.gypi index afcdad1..e9ad7c1 100644 --- a/chrome/chrome_tests.gypi +++ b/chrome/chrome_tests.gypi @@ -1409,8 +1409,8 @@ 'browser/ui/app_list/test/app_list_service_test_api_ash.h', 'browser/ui/app_list/test/app_list_service_test_api_linux.cc', 'browser/ui/app_list/test/app_list_service_test_api_mac.mm', + 'browser/ui/ash/accelerator_commands_browsertest.cc', 'browser/ui/ash/caps_lock_delegate_chromeos_browsertest.cc', - 'browser/ui/ash/chrome_shell_delegate_browsertest.cc', 'browser/ui/ash/launcher/chrome_launcher_controller_browsertest.cc', 'browser/ui/ash/launcher/launcher_favicon_loader_browsertest.cc', 'browser/ui/ash/shelf_browsertest.cc', @@ -1855,8 +1855,8 @@ # for win aura builds. # TODO: enable these for win_ash browser tests. 'browser/chromeos/system/tray_accessibility_browsertest.cc', + 'browser/ui/ash/accelerator_commands_browsertest.cc', 'browser/ui/ash/caps_lock_delegate_chromeos_browsertest.cc', - 'browser/ui/ash/chrome_shell_delegate_browsertest.cc', 'browser/ui/ash/launcher/chrome_launcher_controller_browsertest.cc', 'browser/ui/ash/launcher/launcher_favicon_loader_browsertest.cc', 'browser/ui/ash/shelf_browsertest.cc', |