desktop_browser_frame_aura.cc revision 6e8cce623b6e4fe0c9e4af605d675dd9d0338c38
1// Copyright (c) 2012 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/desktop_browser_frame_aura.h"
6
7#include "chrome/app/chrome_command_ids.h"
8#include "chrome/browser/ui/views/frame/browser_desktop_window_tree_host.h"
9#include "chrome/browser/ui/views/frame/browser_shutdown.h"
10#include "chrome/browser/ui/views/frame/browser_view.h"
11#include "ui/aura/client/aura_constants.h"
12#include "ui/aura/window.h"
13#include "ui/aura/window_event_dispatcher.h"
14#include "ui/aura/window_observer.h"
15#include "ui/base/hit_test.h"
16#include "ui/base/models/simple_menu_model.h"
17#include "ui/gfx/font.h"
18#include "ui/views/view.h"
19#include "ui/wm/core/visibility_controller.h"
20
21using aura::Window;
22
23///////////////////////////////////////////////////////////////////////////////
24// DesktopBrowserFrameAura, public:
25
26DesktopBrowserFrameAura::DesktopBrowserFrameAura(
27    BrowserFrame* browser_frame,
28    BrowserView* browser_view)
29    : views::DesktopNativeWidgetAura(browser_frame),
30      browser_view_(browser_view),
31      browser_frame_(browser_frame),
32      browser_desktop_window_tree_host_(NULL) {
33  GetNativeWindow()->SetName("BrowserFrameAura");
34}
35
36///////////////////////////////////////////////////////////////////////////////
37// DesktopBrowserFrameAura, protected:
38
39DesktopBrowserFrameAura::~DesktopBrowserFrameAura() {
40}
41
42///////////////////////////////////////////////////////////////////////////////
43// DesktopBrowserFrameAura, views::DesktopNativeWidgetAura overrides:
44
45void DesktopBrowserFrameAura::OnHostClosed() {
46  // Destroy any remaining WebContents early on. Doing so may result in
47  // calling back to one of the Views/LayoutManagers or supporting classes of
48  // BrowserView. By destroying here we ensure all said classes are valid.
49  DestroyBrowserWebContents(browser_view_->browser());
50  aura::client::SetVisibilityClient(GetNativeView()->GetRootWindow(), NULL);
51  DesktopNativeWidgetAura::OnHostClosed();
52}
53
54void DesktopBrowserFrameAura::InitNativeWidget(
55    const views::Widget::InitParams& params) {
56  browser_desktop_window_tree_host_ =
57      BrowserDesktopWindowTreeHost::CreateBrowserDesktopWindowTreeHost(
58          browser_frame_,
59          this,
60          browser_view_,
61          browser_frame_);
62  views::Widget::InitParams modified_params = params;
63  modified_params.desktop_window_tree_host =
64      browser_desktop_window_tree_host_->AsDesktopWindowTreeHost();
65  DesktopNativeWidgetAura::InitNativeWidget(modified_params);
66
67  visibility_controller_.reset(new wm::VisibilityController);
68  aura::client::SetVisibilityClient(GetNativeView()->GetRootWindow(),
69                                    visibility_controller_.get());
70  wm::SetChildWindowVisibilityChangesAnimated(
71      GetNativeView()->GetRootWindow());
72}
73
74////////////////////////////////////////////////////////////////////////////////
75// DesktopBrowserFrameAura, NativeBrowserFrame implementation:
76
77views::NativeWidget* DesktopBrowserFrameAura::AsNativeWidget() {
78  return this;
79}
80
81const views::NativeWidget* DesktopBrowserFrameAura::AsNativeWidget() const {
82  return this;
83}
84
85bool DesktopBrowserFrameAura::UsesNativeSystemMenu() const {
86  return browser_desktop_window_tree_host_->UsesNativeSystemMenu();
87}
88
89int DesktopBrowserFrameAura::GetMinimizeButtonOffset() const {
90  return browser_desktop_window_tree_host_->GetMinimizeButtonOffset();
91}
92
93bool DesktopBrowserFrameAura::ShouldSaveWindowPlacement() const {
94  // The placement can always be stored.
95  return true;
96}
97
98void DesktopBrowserFrameAura::GetWindowPlacement(
99    gfx::Rect* bounds,
100    ui::WindowShowState* show_state) const {
101  *bounds = GetWidget()->GetRestoredBounds();
102  if (IsMaximized())
103    *show_state = ui::SHOW_STATE_MAXIMIZED;
104  else if (IsMinimized())
105    *show_state = ui::SHOW_STATE_MINIMIZED;
106  else
107    *show_state = ui::SHOW_STATE_NORMAL;
108}
109