browser_frame_ash.cc revision a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7
1// Copyright 2013 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "chrome/browser/ui/views/frame/browser_frame_ash.h" 6 7#include "ash/wm/window_state.h" 8#include "ash/wm/window_state_delegate.h" 9#include "ash/wm/window_util.h" 10#include "chrome/browser/ui/browser_commands.h" 11#include "chrome/browser/ui/browser_finder.h" 12#include "chrome/browser/ui/views/frame/browser_view.h" 13#include "ui/aura/client/aura_constants.h" 14#include "ui/aura/window.h" 15#include "ui/aura/window_observer.h" 16#include "ui/views/view.h" 17 18using aura::Window; 19 20namespace { 21 22// BrowserWindowStateDelegate class handles a user's fullscreen 23// request (Shift+F4/F4). 24class BrowserWindowStateDelegate : public ash::wm::WindowStateDelegate { 25 public: 26 explicit BrowserWindowStateDelegate(Browser* browser) 27 : browser_(browser) { 28 DCHECK(browser_); 29 } 30 virtual ~BrowserWindowStateDelegate(){} 31 32 // Overridden from ash::wm::WindowStateDelegate. 33 virtual bool ToggleFullscreen(ash::wm::WindowState* window_state) OVERRIDE { 34 DCHECK(window_state->IsFullscreen() || window_state->CanMaximize()); 35 // Windows which cannot be maximized should not be fullscreened. 36 if (!window_state->IsFullscreen() && !window_state->CanMaximize()) 37 return true; 38 chrome::ToggleFullscreenMode(browser_); 39 return true; 40 } 41 private: 42 Browser* browser_; // not owned. 43 44 DISALLOW_COPY_AND_ASSIGN(BrowserWindowStateDelegate); 45}; 46 47} // namespace 48 49/////////////////////////////////////////////////////////////////////////////// 50// BrowserFrameAsh, public: 51 52// static 53const char BrowserFrameAsh::kWindowName[] = "BrowserFrameAsh"; 54 55BrowserFrameAsh::BrowserFrameAsh(BrowserFrame* browser_frame, 56 BrowserView* browser_view) 57 : views::NativeWidgetAura(browser_frame), 58 browser_view_(browser_view) { 59 GetNativeWindow()->SetName(kWindowName); 60 Browser* browser = browser_view->browser(); 61 ash::wm::WindowState* window_state = 62 ash::wm::GetWindowState(GetNativeWindow()); 63 window_state->SetDelegate( 64 scoped_ptr<ash::wm::WindowStateDelegate>( 65 new BrowserWindowStateDelegate(browser)).Pass()); 66 67 // Turn on auto window management if we don't need an explicit bounds. 68 // This way the requested bounds are honored. 69 if (!browser->bounds_overridden() && !browser->is_session_restore()) 70 SetWindowAutoManaged(); 71#if defined(OS_CHROMEOS) 72 if (browser->is_type_tabbed()) { 73 // Animating to immersive fullscreen does not look good. Immersive 74 // fullscreen is the default fullscreen type on ChromeOS for tabbed browser 75 // windows. The WindowState constructor disables animating to fullscreen 76 // completely when the kAshEnableImmersiveFullscreenForAllWindows command 77 // line flag is set. 78 window_state->set_animate_to_fullscreen(false); 79 } 80 81 // For legacy reasons v1 apps (like Secure Shell) are allowed to consume keys 82 // like brightness, volume, etc. Otherwise these keys are handled by the 83 // Ash window manager. 84 window_state->set_can_consume_system_keys(browser->is_app()); 85#endif // defined(OS_CHROMEOS) 86} 87 88/////////////////////////////////////////////////////////////////////////////// 89// BrowserFrameAsh, views::NativeWidgetAura overrides: 90 91void BrowserFrameAsh::OnWindowTargetVisibilityChanged(bool visible) { 92 if (visible) { 93 // Once the window has been shown we know the requested bounds 94 // (if provided) have been honored and we can switch on window management. 95 SetWindowAutoManaged(); 96 } 97 views::NativeWidgetAura::OnWindowTargetVisibilityChanged(visible); 98} 99 100//////////////////////////////////////////////////////////////////////////////// 101// BrowserFrameAsh, NativeBrowserFrame implementation: 102 103views::NativeWidget* BrowserFrameAsh::AsNativeWidget() { 104 return this; 105} 106 107const views::NativeWidget* BrowserFrameAsh::AsNativeWidget() const { 108 return this; 109} 110 111bool BrowserFrameAsh::UsesNativeSystemMenu() const { 112 return false; 113} 114 115int BrowserFrameAsh::GetMinimizeButtonOffset() const { 116 return 0; 117} 118 119BrowserFrameAsh::~BrowserFrameAsh() { 120} 121 122/////////////////////////////////////////////////////////////////////////////// 123// BrowserFrameAsh, private: 124 125void BrowserFrameAsh::SetWindowAutoManaged() { 126 if (browser_view_->browser()->type() != Browser::TYPE_POPUP || 127 browser_view_->browser()->is_app()) { 128 ash::wm::GetWindowState(GetNativeWindow())-> 129 set_window_position_managed(true); 130 } 131} 132