browser_frame_ash.cc revision f2477e01787aa58f445919b809d89e252beef54f
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());
661e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  window_state->set_animate_to_fullscreen(!browser->is_type_tabbed());
67424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Turn on auto window management if we don't need an explicit bounds.
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This way the requested bounds are honored.
701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (!browser->bounds_overridden() && !browser->is_session_restore())
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetWindowAutoManaged();
724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#if defined(OS_CHROMEOS)
734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // For legacy reasons v1 apps (like Secure Shell) are allowed to consume keys
744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // like brightness, volume, etc. Otherwise these keys are handled by the
754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Ash window manager.
761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  window_state->set_can_consume_system_keys(browser->is_app());
774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif  // defined(OS_CHROMEOS)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)///////////////////////////////////////////////////////////////////////////////
814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// BrowserFrameAsh, views::NativeWidgetAura overrides:
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void BrowserFrameAsh::OnWindowTargetVisibilityChanged(bool visible) {
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (visible) {
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Once the window has been shown we know the requested bounds
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // (if provided) have been honored and we can switch on window management.
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetWindowAutoManaged();
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::NativeWidgetAura::OnWindowTargetVisibilityChanged(visible);
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// BrowserFrameAsh, NativeBrowserFrame implementation:
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)views::NativeWidget* BrowserFrameAsh::AsNativeWidget() {
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return this;
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)const views::NativeWidget* BrowserFrameAsh::AsNativeWidget() const {
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return this;
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)bool BrowserFrameAsh::UsesNativeSystemMenu() const {
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return false;
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)int BrowserFrameAsh::GetMinimizeButtonOffset() const {
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return 0;
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
111f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)BrowserFrameAsh::~BrowserFrameAsh() {
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)///////////////////////////////////////////////////////////////////////////////
1154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// BrowserFrameAsh, private:
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void BrowserFrameAsh::SetWindowAutoManaged() {
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (browser_view_->browser()->type() != Browser::TYPE_POPUP ||
11958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      browser_view_->browser()->is_app()) {
12068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    ash::wm::GetWindowState(GetNativeWindow())->
12158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        set_window_position_managed(true);
12258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
124