Commit 7d6c8b29 authored by erg's avatar erg Committed by Commit bot

mus: The window server needs to be able to write to the clipboard.

This lifetime management for ClipboardImpl from service.cc to the window
server.

BUG=614037

Review-Url: https://codereview.chromium.org/2180593002
Cr-Commit-Position: refs/heads/master@{#407308}
parent 6610df62
...@@ -75,7 +75,6 @@ struct Service::PendingRequest { ...@@ -75,7 +75,6 @@ struct Service::PendingRequest {
}; };
struct Service::UserState { struct Service::UserState {
std::unique_ptr<clipboard::ClipboardImpl> clipboard;
std::unique_ptr<ws::AccessibilityManager> accessibility; std::unique_ptr<ws::AccessibilityManager> accessibility;
std::unique_ptr<ws::WindowTreeHostFactory> window_tree_host_factory; std::unique_ptr<ws::WindowTreeHostFactory> window_tree_host_factory;
}; };
...@@ -296,10 +295,8 @@ void Service::Create(shell::Connection* connection, ...@@ -296,10 +295,8 @@ void Service::Create(shell::Connection* connection,
void Service::Create(shell::Connection* connection, void Service::Create(shell::Connection* connection,
mojom::ClipboardRequest request) { mojom::ClipboardRequest request) {
UserState* user_state = GetUserState(connection); const ws::UserId& user_id = connection->GetRemoteIdentity().user_id();
if (!user_state->clipboard) window_server_->GetClipboardForUser(user_id)->AddBinding(std::move(request));
user_state->clipboard.reset(new clipboard::ClipboardImpl);
user_state->clipboard->AddBinding(std::move(request));
} }
void Service::Create(shell::Connection* connection, void Service::Create(shell::Connection* connection,
......
...@@ -112,6 +112,7 @@ static_library("lib") { ...@@ -112,6 +112,7 @@ static_library("lib") {
"//services/shell/public/cpp", "//services/shell/public/cpp",
"//services/shell/public/interfaces", "//services/shell/public/interfaces",
"//services/tracing/public/cpp", "//services/tracing/public/cpp",
"//services/ui/clipboard:lib",
"//services/ui/common:mus_common", "//services/ui/common:mus_common",
"//services/ui/display", "//services/ui/display",
"//services/ui/gles2", "//services/ui/gles2",
......
...@@ -242,6 +242,12 @@ void WindowServer::OnFirstWindowManagerWindowTreeFactoryReady() { ...@@ -242,6 +242,12 @@ void WindowServer::OnFirstWindowManagerWindowTreeFactoryReady() {
delegate_->CreateDefaultDisplays(); delegate_->CreateDefaultDisplays();
} }
ui::clipboard::ClipboardImpl* WindowServer::GetClipboardForUser(
const UserId& user_id) {
DCHECK_GT(clipboard_map_.count(user_id), 0u);
return clipboard_map_[user_id].get();
}
UserActivityMonitor* WindowServer::GetUserActivityMonitorForUser( UserActivityMonitor* WindowServer::GetUserActivityMonitorForUser(
const UserId& user_id) { const UserId& user_id) {
DCHECK_GT(activity_monitor_map_.count(user_id), 0u); DCHECK_GT(activity_monitor_map_.count(user_id), 0u);
...@@ -769,10 +775,12 @@ void WindowServer::OnActiveUserIdChanged(const UserId& previously_active_id, ...@@ -769,10 +775,12 @@ void WindowServer::OnActiveUserIdChanged(const UserId& previously_active_id,
void WindowServer::OnUserIdAdded(const UserId& id) { void WindowServer::OnUserIdAdded(const UserId& id) {
activity_monitor_map_[id] = base::MakeUnique<UserActivityMonitor>(nullptr); activity_monitor_map_[id] = base::MakeUnique<UserActivityMonitor>(nullptr);
clipboard_map_[id] = base::MakeUnique<clipboard::ClipboardImpl>();
} }
void WindowServer::OnUserIdRemoved(const UserId& id) { void WindowServer::OnUserIdRemoved(const UserId& id) {
activity_monitor_map_.erase(id); activity_monitor_map_.erase(id);
clipboard_map_.erase(id);
} }
} // namespace ws } // namespace ws
......
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
#include "base/macros.h" #include "base/macros.h"
#include "mojo/public/cpp/bindings/array.h" #include "mojo/public/cpp/bindings/array.h"
#include "mojo/public/cpp/bindings/binding.h" #include "mojo/public/cpp/bindings/binding.h"
#include "services/ui/clipboard/clipboard_impl.h"
#include "services/ui/public/interfaces/window_manager_window_tree_factory.mojom.h" #include "services/ui/public/interfaces/window_manager_window_tree_factory.mojom.h"
#include "services/ui/public/interfaces/window_tree.mojom.h" #include "services/ui/public/interfaces/window_tree.mojom.h"
#include "services/ui/public/interfaces/window_tree_host.mojom.h" #include "services/ui/public/interfaces/window_tree_host.mojom.h"
...@@ -131,6 +132,8 @@ class WindowServer : public ServerWindowDelegate, ...@@ -131,6 +132,8 @@ class WindowServer : public ServerWindowDelegate,
void OnFirstWindowManagerWindowTreeFactoryReady(); void OnFirstWindowManagerWindowTreeFactoryReady();
clipboard::ClipboardImpl* GetClipboardForUser(const UserId& user_id);
UserActivityMonitor* GetUserActivityMonitorForUser(const UserId& user_id); UserActivityMonitor* GetUserActivityMonitorForUser(const UserId& user_id);
WindowManagerWindowTreeFactorySet* window_manager_window_tree_factory_set() { WindowManagerWindowTreeFactorySet* window_manager_window_tree_factory_set() {
...@@ -218,6 +221,8 @@ class WindowServer : public ServerWindowDelegate, ...@@ -218,6 +221,8 @@ class WindowServer : public ServerWindowDelegate,
std::map<ClientSpecificId, std::unique_ptr<WindowTree>>; std::map<ClientSpecificId, std::unique_ptr<WindowTree>>;
using UserActivityMonitorMap = using UserActivityMonitorMap =
std::map<UserId, std::unique_ptr<UserActivityMonitor>>; std::map<UserId, std::unique_ptr<UserActivityMonitor>>;
using UserClipboardMap =
std::map<UserId, std::unique_ptr<ui::clipboard::ClipboardImpl>>;
struct InFlightWindowManagerChange { struct InFlightWindowManagerChange {
// Identifies the client that initiated the change. // Identifies the client that initiated the change.
...@@ -350,6 +355,7 @@ class WindowServer : public ServerWindowDelegate, ...@@ -350,6 +355,7 @@ class WindowServer : public ServerWindowDelegate,
base::Callback<void(ServerWindow*)> window_paint_callback_; base::Callback<void(ServerWindow*)> window_paint_callback_;
UserActivityMonitorMap activity_monitor_map_; UserActivityMonitorMap activity_monitor_map_;
UserClipboardMap clipboard_map_;
WindowManagerWindowTreeFactorySet window_manager_window_tree_factory_set_; WindowManagerWindowTreeFactorySet window_manager_window_tree_factory_set_;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment