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