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