15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 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)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/views/frame/desktop_browser_frame_aura.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/app/chrome_command_ids.h"
85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/ui/views/frame/browser_desktop_window_tree_host.h"
95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/ui/views/frame/browser_shutdown.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/views/frame/browser_view.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/client/aura_constants.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/window.h"
13a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/aura/window_event_dispatcher.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/window_observer.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/hit_test.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/models/simple_menu_model.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/font.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/view.h"
19a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/wm/core/visibility_controller.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using aura::Window;
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)///////////////////////////////////////////////////////////////////////////////
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// DesktopBrowserFrameAura, public:
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DesktopBrowserFrameAura::DesktopBrowserFrameAura(
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BrowserFrame* browser_frame,
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BrowserView* browser_view)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : views::DesktopNativeWidgetAura(browser_frame),
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      browser_view_(browser_view),
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      browser_frame_(browser_frame),
325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      browser_desktop_window_tree_host_(NULL) {
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetNativeWindow()->SetName("BrowserFrameAura");
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)///////////////////////////////////////////////////////////////////////////////
3758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// DesktopBrowserFrameAura, protected:
3858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
3958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)DesktopBrowserFrameAura::~DesktopBrowserFrameAura() {
4058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
4158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
4258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)///////////////////////////////////////////////////////////////////////////////
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// DesktopBrowserFrameAura, views::DesktopNativeWidgetAura overrides:
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void DesktopBrowserFrameAura::OnHostClosed() {
465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Destroy any remaining WebContents early on. Doing so may result in
475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // calling back to one of the Views/LayoutManagers or supporting classes of
485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // BrowserView. By destroying here we ensure all said classes are valid.
495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DestroyBrowserWebContents(browser_view_->browser());
504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  aura::client::SetVisibilityClient(GetNativeView()->GetRootWindow(), NULL);
514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  DesktopNativeWidgetAura::OnHostClosed();
524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DesktopBrowserFrameAura::InitNativeWidget(
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const views::Widget::InitParams& params) {
565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  browser_desktop_window_tree_host_ =
575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      BrowserDesktopWindowTreeHost::CreateBrowserDesktopWindowTreeHost(
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          browser_frame_,
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          this,
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          browser_view_,
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          browser_frame_);
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::Widget::InitParams modified_params = params;
635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  modified_params.desktop_window_tree_host =
645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      browser_desktop_window_tree_host_->AsDesktopWindowTreeHost();
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DesktopNativeWidgetAura::InitNativeWidget(modified_params);
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
67a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  visibility_controller_.reset(new wm::VisibilityController);
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aura::client::SetVisibilityClient(GetNativeView()->GetRootWindow(),
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    visibility_controller_.get());
70a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  wm::SetChildWindowVisibilityChangesAnimated(
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetNativeView()->GetRootWindow());
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// DesktopBrowserFrameAura, NativeBrowserFrame implementation:
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)views::NativeWidget* DesktopBrowserFrameAura::AsNativeWidget() {
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return this;
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const views::NativeWidget* DesktopBrowserFrameAura::AsNativeWidget() const {
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return this;
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool DesktopBrowserFrameAura::UsesNativeSystemMenu() const {
865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return browser_desktop_window_tree_host_->UsesNativeSystemMenu();
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int DesktopBrowserFrameAura::GetMinimizeButtonOffset() const {
905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return browser_desktop_window_tree_host_->GetMinimizeButtonOffset();
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
92010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
93010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)bool DesktopBrowserFrameAura::ShouldSaveWindowPlacement() const {
94010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // The placement can always be stored.
95010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  return true;
96010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
97010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
98010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void DesktopBrowserFrameAura::GetWindowPlacement(
99010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    gfx::Rect* bounds,
100010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    ui::WindowShowState* show_state) const {
101010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  *bounds = GetWidget()->GetRestoredBounds();
102010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  if (IsMaximized())
103010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    *show_state = ui::SHOW_STATE_MAXIMIZED;
104010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  else if (IsMinimized())
105010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    *show_state = ui::SHOW_STATE_MINIMIZED;
106010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  else
107010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    *show_state = ui::SHOW_STATE_NORMAL;
108010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
109