14e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
54e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chrome/browser/ui/views/frame/browser_frame_ash.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
74e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "ash/wm/window_state.h"
81e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "ash/wm/window_state_delegate.h"
94e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "ash/wm/window_util.h"
101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "chrome/browser/ui/browser_commands.h"
111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "chrome/browser/ui/browser_finder.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/views/frame/browser_view.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/client/aura_constants.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/window.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/window_observer.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/view.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using aura::Window;
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)namespace {
211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
22f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// BrowserWindowStateDelegate class handles a user's fullscreen
23f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// request (Shift+F4/F4).
241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)class BrowserWindowStateDelegate : public ash::wm::WindowStateDelegate {
251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) public:
261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  explicit BrowserWindowStateDelegate(Browser* browser)
271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      : browser_(browser) {
281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    DCHECK(browser_);
291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  virtual ~BrowserWindowStateDelegate(){}
311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Overridden from ash::wm::WindowStateDelegate.
331e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  virtual bool ToggleFullscreen(ash::wm::WindowState* window_state) OVERRIDE {
341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    DCHECK(window_state->IsFullscreen() || window_state->CanMaximize());
351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    // Windows which cannot be maximized should not be fullscreened.
361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    if (!window_state->IsFullscreen() && !window_state->CanMaximize())
371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      return true;
381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    chrome::ToggleFullscreenMode(browser_);
391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    return true;
401e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) private:
421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  Browser* browser_;  // not owned.
431e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(BrowserWindowStateDelegate);
451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)};
461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}  // namespace
481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)///////////////////////////////////////////////////////////////////////////////
504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// BrowserFrameAsh, public:
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// static
534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)const char BrowserFrameAsh::kWindowName[] = "BrowserFrameAsh";
54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)BrowserFrameAsh::BrowserFrameAsh(BrowserFrame* browser_frame,
564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                 BrowserView* browser_view)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : views::NativeWidgetAura(browser_frame),
58f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      browser_view_(browser_view) {
59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GetNativeWindow()->SetName(kWindowName);
601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  Browser* browser = browser_view->browser();
611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ash::wm::WindowState* window_state =
621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      ash::wm::GetWindowState(GetNativeWindow());
63f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  window_state->SetDelegate(
64f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      scoped_ptr<ash::wm::WindowStateDelegate>(
65f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          new BrowserWindowStateDelegate(browser)).Pass());
66424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Turn on auto window management if we don't need an explicit bounds.
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This way the requested bounds are honored.
691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (!browser->bounds_overridden() && !browser->is_session_restore())
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetWindowAutoManaged();
714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#if defined(OS_CHROMEOS)
72a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (browser->is_type_tabbed()) {
73a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    // Animating to immersive fullscreen does not look good. Immersive
74a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    // fullscreen is the default fullscreen type on ChromeOS for tabbed browser
75a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    // windows. The WindowState constructor disables animating to fullscreen
76a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    // completely when the kAshEnableImmersiveFullscreenForAllWindows command
77a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    // line flag is set.
78a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    window_state->set_animate_to_fullscreen(false);
79a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
80a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // For legacy reasons v1 apps (like Secure Shell) are allowed to consume keys
824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // like brightness, volume, etc. Otherwise these keys are handled by the
834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Ash window manager.
841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  window_state->set_can_consume_system_keys(browser->is_app());
854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif  // defined(OS_CHROMEOS)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)///////////////////////////////////////////////////////////////////////////////
894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// BrowserFrameAsh, views::NativeWidgetAura overrides:
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void BrowserFrameAsh::OnWindowTargetVisibilityChanged(bool visible) {
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (visible) {
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Once the window has been shown we know the requested bounds
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // (if provided) have been honored and we can switch on window management.
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetWindowAutoManaged();
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::NativeWidgetAura::OnWindowTargetVisibilityChanged(visible);
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
1014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// BrowserFrameAsh, NativeBrowserFrame implementation:
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)views::NativeWidget* BrowserFrameAsh::AsNativeWidget() {
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return this;
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)const views::NativeWidget* BrowserFrameAsh::AsNativeWidget() const {
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return this;
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)bool BrowserFrameAsh::UsesNativeSystemMenu() const {
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return false;
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)int BrowserFrameAsh::GetMinimizeButtonOffset() const {
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return 0;
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
119f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)BrowserFrameAsh::~BrowserFrameAsh() {
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)///////////////////////////////////////////////////////////////////////////////
1234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// BrowserFrameAsh, private:
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void BrowserFrameAsh::SetWindowAutoManaged() {
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (browser_view_->browser()->type() != Browser::TYPE_POPUP ||
12758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      browser_view_->browser()->is_app()) {
12868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    ash::wm::GetWindowState(GetNativeWindow())->
12958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        set_window_position_managed(true);
13058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
132