Index: chrome/browser/ui/views/frame/browser_frame_ash.cc |
diff --git a/chrome/browser/ui/views/frame/browser_frame_ash.cc b/chrome/browser/ui/views/frame/browser_frame_ash.cc |
index 07f4e332ebbf953b1a7b1912b59e0d2153efdc9b..d108863fe2025da6010742864d53c19c9f28a837 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,24 @@ 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(new AppWindowStateDelegate(browser)); |
+ else |
+ window_state->SetDelegate(new BrowserWindowStateDelegate(browser)); |
+ 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) |
} |