Home | History | Annotate | Download | only in frame
      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 
     21 using aura::Window;
     22 
     23 ///////////////////////////////////////////////////////////////////////////////
     24 // DesktopBrowserFrameAura, public:
     25 
     26 DesktopBrowserFrameAura::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 
     39 DesktopBrowserFrameAura::~DesktopBrowserFrameAura() {
     40 }
     41 
     42 ///////////////////////////////////////////////////////////////////////////////
     43 // DesktopBrowserFrameAura, views::DesktopNativeWidgetAura overrides:
     44 
     45 void 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 
     54 void 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 
     77 views::NativeWidget* DesktopBrowserFrameAura::AsNativeWidget() {
     78   return this;
     79 }
     80 
     81 const views::NativeWidget* DesktopBrowserFrameAura::AsNativeWidget() const {
     82   return this;
     83 }
     84 
     85 bool DesktopBrowserFrameAura::UsesNativeSystemMenu() const {
     86   return browser_desktop_window_tree_host_->UsesNativeSystemMenu();
     87 }
     88 
     89 int DesktopBrowserFrameAura::GetMinimizeButtonOffset() const {
     90   return browser_desktop_window_tree_host_->GetMinimizeButtonOffset();
     91 }
     92 
     93 bool DesktopBrowserFrameAura::ShouldSaveWindowPlacement() const {
     94   // The placement can always be stored.
     95   return true;
     96 }
     97 
     98 void 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