blob: a48c7386f78d49717ae1dbae91e76c99b0e03c9b [file] [log] [blame]
// Copyright 2018 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 "ash/ws/window_service_owner.h"
#include <cstdint>
#include "ash/public/cpp/window_properties.h"
#include "ash/shell.h"
#include "ash/wm/non_client_frame_controller.h"
#include "ash/ws/window_service_delegate_impl.h"
#include "base/lazy_instance.h"
#include "base/unguessable_token.h"
#include "services/content/public/cpp/buildflags.h"
#include "services/ws/public/cpp/host/gpu_interface_provider.h"
#include "ui/base/ui_base_features.h"
#include "ui/display/display.h"
#include "ui/display/screen.h"
#include "ui/wm/core/focus_controller.h"
#if BUILDFLAG(ENABLE_REMOTE_NAVIGABLE_CONTENTS_VIEW)
#include "services/content/public/cpp/navigable_contents_view.h"
#include "services/ws/remote_view_host/server_remote_view_host.h"
#endif // BUILDFLAG(ENABLE_REMOTE_NAVIGABLE_CONTENTS_VIEW)
namespace ash {
#if BUILDFLAG(ENABLE_REMOTE_NAVIGABLE_CONTENTS_VIEW)
namespace {
class ServerRemoteContentViewManager
: public content::NavigableContentsView::RemoteViewManager {
public:
explicit ServerRemoteContentViewManager(ws::WindowService* window_service)
: window_service_(window_service) {}
~ServerRemoteContentViewManager() override = default;
// content::NavigableContentsView::RemoteViewManager:
std::unique_ptr<views::NativeViewHost> CreateRemoteViewHost() override {
return std::make_unique<ws::ServerRemoteViewHost>(window_service_);
}
void EmbedUsingToken(views::NativeViewHost* view_host,
const base::UnguessableToken& token) override {
constexpr uint32_t kEmbedFlags =
ws::mojom::kEmbedFlagEmbedderControlsVisibility;
static_cast<ws::ServerRemoteViewHost*>(view_host)->EmbedUsingToken(
token, kEmbedFlags, base::DoNothing());
}
private:
ws::WindowService* const window_service_;
DISALLOW_COPY_AND_ASSIGN(ServerRemoteContentViewManager);
};
} // namespace
#endif // BUILDFLAG(ENABLE_REMOTE_NAVIGABLE_CONTENTS_VIEW)
WindowServiceOwner::WindowServiceOwner(
std::unique_ptr<ws::GpuInterfaceProvider> gpu_interface_provider)
: window_service_delegate_(std::make_unique<WindowServiceDelegateImpl>()),
window_service_(window_service_delegate_.get(),
std::move(gpu_interface_provider),
Shell::Get()->focus_controller(),
!::features::IsMultiProcessMash(),
Shell::Get()->aura_env()) {
window_service_.SetFrameDecorationValues(
NonClientFrameController::GetPreferredClientAreaInsets(),
NonClientFrameController::GetMaxTitleBarButtonWidth());
window_service_.SetDisplayForNewWindows(
display::Screen::GetScreen()->GetDisplayForNewWindows().id());
RegisterWindowProperties(window_service_.property_converter());
#if BUILDFLAG(ENABLE_REMOTE_NAVIGABLE_CONTENTS_VIEW)
content::NavigableContentsView::SetRemoteViewManager(
std::make_unique<ServerRemoteContentViewManager>(&window_service_));
#endif // BUILDFLAG(ENABLE_REMOTE_NAVIGABLE_CONTENTS_VIEW)
}
WindowServiceOwner::~WindowServiceOwner() = default;
void WindowServiceOwner::BindWindowService(
service_manager::mojom::ServiceRequest request) {
window_service_.BindServiceRequest(std::move(request));
}
} // namespace ash