blob: 9bc01ee92b299b73bf0553fc23ec337f1e567757 [file] [log] [blame]
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/ui/views/frame/browser_frame_mash.h"
#include <stdint.h>
#include <memory>
#include "ash/public/cpp/shelf_types.h"
#include "ash/public/cpp/window_properties.h"
#include "ash/public/cpp/window_state_type.h"
#include "ash/public/interfaces/window_properties.mojom.h"
#include "ash/public/interfaces/window_style.mojom.h"
#include "chrome/browser/ui/browser_window_state.h"
#include "chrome/browser/ui/views/frame/browser_frame.h"
#include "chrome/browser/ui/views/frame/browser_frame_ash.h"
#include "chrome/browser/ui/views/frame/browser_non_client_frame_view_ash.h"
#include "chrome/browser/ui/views/frame/browser_view.h"
#include "chrome/common/extensions/extension_constants.h"
#include "services/ui/public/cpp/property_type_converters.h"
#include "services/ui/public/interfaces/window_manager.mojom.h"
#include "services/ui/public/interfaces/window_tree.mojom.h"
#include "ui/aura/client/aura_constants.h"
#include "ui/aura/mus/window_tree_host_mus_init_params.h"
#include "ui/base/ui_base_features.h"
#include "ui/views/mus/desktop_window_tree_host_mus.h"
#include "ui/views/mus/mus_client.h"
#include "ui/views/mus/window_manager_frame_values.h"
BrowserFrameMash::BrowserFrameMash(BrowserFrame* browser_frame,
BrowserView* browser_view)
: views::DesktopNativeWidgetAura(browser_frame),
browser_frame_(browser_frame),
browser_view_(browser_view) {
DCHECK(browser_frame_);
DCHECK(browser_view_);
DCHECK(features::IsUsingWindowService());
}
BrowserFrameMash::~BrowserFrameMash() {}
views::Widget::InitParams BrowserFrameMash::GetWidgetParams() {
views::Widget::InitParams params;
params.name = "BrowserFrame";
params.native_widget = this;
chrome::GetSavedWindowBoundsAndShowState(browser_view_->browser(),
&params.bounds, &params.show_state);
params.delegate = browser_view_;
std::map<std::string, std::vector<uint8_t>> properties =
views::MusClient::ConfigurePropertiesFromParams(params);
// Indicates mash shouldn't handle immersive, rather we will.
properties[ui::mojom::WindowManager::kDisableImmersive_InitProperty] =
mojo::ConvertTo<std::vector<uint8_t>>(true);
Browser* browser = browser_view_->browser();
properties[ash::mojom::kAshWindowStyle_InitProperty] =
mojo::ConvertTo<std::vector<uint8_t>>(static_cast<int32_t>(
BrowserNonClientFrameViewAsh::UsePackagedAppHeaderStyle(browser)
? ash::mojom::WindowStyle::DEFAULT
: ash::mojom::WindowStyle::BROWSER));
// ChromeLauncherController manages the browser shortcut shelf item; set the
// window's shelf item type property to be ignored by ash::ShelfWindowWatcher.
properties[ui::mojom::WindowManager::kShelfItemType_Property] =
mojo::ConvertTo<std::vector<uint8_t>>(
static_cast<int64_t>(ash::TYPE_BROWSER_SHORTCUT));
// TODO(estade): to match classic Ash, this property should be toggled to true
// for non-popups after the window is initially shown.
properties[ash::mojom::kWindowPositionManaged_Property] =
mojo::ConvertTo<std::vector<uint8_t>>(static_cast<int64_t>(
!browser->bounds_overridden() && !browser->is_session_restore() &&
!browser->is_type_popup()));
properties[ash::mojom::kCanConsumeSystemKeys_Property] =
mojo::ConvertTo<std::vector<uint8_t>>(
static_cast<int64_t>(browser->is_app()));
aura::WindowTreeHostMusInitParams window_tree_host_init_params =
aura::CreateInitParamsForTopLevel(
views::MusClient::Get()->window_tree_client(), std::move(properties));
std::unique_ptr<views::DesktopWindowTreeHostMus> desktop_window_tree_host =
std::make_unique<views::DesktopWindowTreeHostMus>(
std::move(window_tree_host_init_params), browser_frame_, this);
// BrowserNonClientFrameViewAsh::OnBoundsChanged() takes care of updating
// the insets.
desktop_window_tree_host->set_auto_update_client_area(false);
SetDesktopWindowTreeHost(std::move(desktop_window_tree_host));
return params;
}
bool BrowserFrameMash::UseCustomFrame() const {
return true;
}
bool BrowserFrameMash::UsesNativeSystemMenu() const {
return false;
}
bool BrowserFrameMash::ShouldSaveWindowPlacement() const {
return nullptr == GetWidget()->GetNativeWindow()->GetProperty(
ash::kRestoreBoundsOverrideKey);
}
void BrowserFrameMash::GetWindowPlacement(
gfx::Rect* bounds,
ui::WindowShowState* show_state) const {
DesktopNativeWidgetAura::GetWindowPlacement(bounds, show_state);
gfx::Rect* override_bounds = GetWidget()->GetNativeWindow()->GetProperty(
ash::kRestoreBoundsOverrideKey);
if (override_bounds && !override_bounds->IsEmpty()) {
*bounds = *override_bounds;
*show_state =
ash::ToWindowShowState(GetWidget()->GetNativeWindow()->GetProperty(
ash::kRestoreWindowStateTypeOverrideKey));
}
// Session restore might be unable to correctly restore other states.
// For the record, https://crbug.com/396272
if (*show_state != ui::SHOW_STATE_MAXIMIZED &&
*show_state != ui::SHOW_STATE_MINIMIZED) {
*show_state = ui::SHOW_STATE_NORMAL;
}
}
content::KeyboardEventProcessingResult BrowserFrameMash::PreHandleKeyboardEvent(
const content::NativeWebKeyboardEvent& event) {
return content::KeyboardEventProcessingResult::NOT_HANDLED;
}
bool BrowserFrameMash::HandleKeyboardEvent(
const content::NativeWebKeyboardEvent& event) {
return false;
}
int BrowserFrameMash::GetMinimizeButtonOffset() const {
return 0;
}