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