| Index: components/mus/ws/window_tree_impl.cc
|
| diff --git a/components/mus/ws/window_tree_impl.cc b/components/mus/ws/window_tree_impl.cc
|
| index 2df84a5298d0636d0c4c28d2101ca0fed0675b47..7cfa5e3228421f97e00119d721f4e676387c71b7 100644
|
| --- a/components/mus/ws/window_tree_impl.cc
|
| +++ b/components/mus/ws/window_tree_impl.cc
|
| @@ -67,6 +67,7 @@ WindowTreeImpl::WindowTreeImpl(ConnectionManager* connection_manager,
|
| uint32_t policy_bitmask)
|
| : connection_manager_(connection_manager),
|
| id_(connection_manager_->GetAndAdvanceNextConnectionId()),
|
| + next_window_id_(1),
|
| client_(nullptr),
|
| event_ack_id_(0),
|
| event_source_host_(nullptr),
|
| @@ -100,26 +101,47 @@ void WindowTreeImpl::Init(mojom::WindowTreeClient* client,
|
| host ? host->GetFocusedWindow() : nullptr;
|
| if (focused_window)
|
| focused_window = access_policy_->GetWindowForFocusChange(focused_window);
|
| - const Id focused_window_transport_id(MapWindowIdToClient(focused_window));
|
| + ClientWindowId focused_window_id;
|
| + if (focused_window)
|
| + IsWindowKnown(focused_window, &focused_window_id);
|
|
|
| client->OnEmbed(id_, WindowToWindowData(to_send.front()), std::move(tree),
|
| - focused_window_transport_id,
|
| + focused_window_id.id,
|
| is_embed_root_ ? WindowTree::kAccessPolicyEmbedRoot
|
| : WindowTree::kAccessPolicyDefault);
|
| }
|
|
|
| const ServerWindow* WindowTreeImpl::GetWindow(const WindowId& id) const {
|
| if (id_ == id.connection_id) {
|
| - WindowMap::const_iterator i = window_map_.find(id.window_id);
|
| - return i == window_map_.end() ? NULL : i->second;
|
| + auto iter = created_window_map_.find(id);
|
| + return iter == created_window_map_.end() ? nullptr : iter->second;
|
| }
|
| return connection_manager_->GetWindow(id);
|
| }
|
|
|
| +bool WindowTreeImpl::IsWindowKnown(const ServerWindow* window,
|
| + ClientWindowId* id) const {
|
| + if (!window)
|
| + return false;
|
| + auto iter = window_id_to_client_id_map_.find(window->id());
|
| + if (iter == window_id_to_client_id_map_.end())
|
| + return false;
|
| + if (id)
|
| + *id = iter->second;
|
| + return true;
|
| +}
|
| +
|
| bool WindowTreeImpl::HasRoot(const ServerWindow* window) const {
|
| return roots_.count(window) > 0;
|
| }
|
|
|
| +const ServerWindow* WindowTreeImpl::GetWindowByClientId(
|
| + const ClientWindowId& id) const {
|
| + auto iter = client_id_to_window_id_map_.find(id);
|
| + return iter == client_id_to_window_id_map_.end() ? nullptr
|
| + : GetWindow(iter->second);
|
| +}
|
| +
|
| const WindowTreeHostImpl* WindowTreeImpl::GetHost(
|
| const ServerWindow* window) const {
|
| return window ? connection_manager_->GetWindowTreeHostByWindow(window)
|
| @@ -131,11 +153,10 @@ void WindowTreeImpl::OnWindowDestroyingTreeImpl(WindowTreeImpl* connection) {
|
| for (const auto* connection_root : connection->roots_) {
|
| const bool owns_connection_root =
|
| connection_root->id().connection_id == id_;
|
| - const bool knows_about_connection_root =
|
| - window_map_.count(connection_root->id().window_id) > 0;
|
| - if ((owns_connection_root && knows_about_connection_root) ||
|
| + if (owns_connection_root ||
|
| (is_embed_root_ && IsWindowKnown(connection_root))) {
|
| - client_->OnEmbeddedAppDisconnected(MapWindowIdToClient(connection_root));
|
| + client_->OnEmbeddedAppDisconnected(
|
| + ClientWindowIdForWindow(connection_root).id);
|
| }
|
| }
|
| }
|
| @@ -154,20 +175,24 @@ void WindowTreeImpl::NotifyChangeCompleted(
|
| }
|
|
|
| bool WindowTreeImpl::NewWindow(
|
| - const WindowId& window_id,
|
| + const ClientWindowId& client_window_id,
|
| const std::map<std::string, std::vector<uint8_t>>& properties) {
|
| - if (!IsValidIdForNewWindow(window_id))
|
| + if (!IsValidIdForNewWindow(client_window_id))
|
| return false;
|
| - window_map_[window_id.window_id] =
|
| + const WindowId window_id = GenerateNewWindowId();
|
| + DCHECK(!GetWindow(window_id));
|
| + ServerWindow* window =
|
| connection_manager_->CreateServerWindow(window_id, properties);
|
| - known_windows_.insert(WindowIdToTransportId(window_id));
|
| + created_window_map_[window_id] = window;
|
| + client_id_to_window_id_map_[client_window_id] = window_id;
|
| + window_id_to_client_id_map_[window_id] = client_window_id;
|
| return true;
|
| }
|
|
|
| -bool WindowTreeImpl::AddWindow(const WindowId& parent_id,
|
| - const WindowId& child_id) {
|
| - ServerWindow* parent = GetWindow(MapWindowIdFromClient(parent_id));
|
| - ServerWindow* child = GetWindow(MapWindowIdFromClient(child_id));
|
| +bool WindowTreeImpl::AddWindow(const ClientWindowId& parent_id,
|
| + const ClientWindowId& child_id) {
|
| + ServerWindow* parent = GetWindowByClientId(parent_id);
|
| + ServerWindow* child = GetWindowByClientId(child_id);
|
| if (parent && child && child->parent() != parent &&
|
| !child->Contains(parent) && access_policy_->CanAddWindow(parent, child)) {
|
| Operation op(this, connection_manager_, OperationType::ADD_WINDOW);
|
| @@ -177,11 +202,11 @@ bool WindowTreeImpl::AddWindow(const WindowId& parent_id,
|
| return false;
|
| }
|
|
|
| -bool WindowTreeImpl::AddTransientWindow(const WindowId& window_id,
|
| - const WindowId& transient_window_id) {
|
| - ServerWindow* window = GetWindow(MapWindowIdFromClient(window_id));
|
| - ServerWindow* transient_window =
|
| - GetWindow(MapWindowIdFromClient(transient_window_id));
|
| +bool WindowTreeImpl::AddTransientWindow(
|
| + const ClientWindowId& window_id,
|
| + const ClientWindowId& transient_window_id) {
|
| + ServerWindow* window = GetWindowByClientId(window_id);
|
| + ServerWindow* transient_window = GetWindowByClientId(transient_window_id);
|
| if (window && transient_window && !transient_window->Contains(window) &&
|
| access_policy_->CanAddTransientWindow(window, transient_window)) {
|
| Operation op(this, connection_manager_,
|
| @@ -193,17 +218,17 @@ bool WindowTreeImpl::AddTransientWindow(const WindowId& window_id,
|
| }
|
|
|
| std::vector<const ServerWindow*> WindowTreeImpl::GetWindowTree(
|
| - const WindowId& window_id) const {
|
| - const ServerWindow* window = GetWindow(window_id);
|
| + const ClientWindowId& window_id) const {
|
| + const ServerWindow* window = GetWindowByClientId(window_id);
|
| std::vector<const ServerWindow*> windows;
|
| if (window)
|
| GetWindowTreeImpl(window, &windows);
|
| return windows;
|
| }
|
|
|
| -bool WindowTreeImpl::SetWindowVisibility(const WindowId& window_id,
|
| +bool WindowTreeImpl::SetWindowVisibility(const ClientWindowId& window_id,
|
| bool visible) {
|
| - ServerWindow* window = GetWindow(MapWindowIdFromClient(window_id));
|
| + ServerWindow* window = GetWindowByClientId(window_id);
|
| if (!window || window->visible() == visible ||
|
| !access_policy_->CanChangeWindowVisibility(window)) {
|
| return false;
|
| @@ -213,16 +238,17 @@ bool WindowTreeImpl::SetWindowVisibility(const WindowId& window_id,
|
| return true;
|
| }
|
|
|
| -bool WindowTreeImpl::Embed(const WindowId& window_id,
|
| +bool WindowTreeImpl::Embed(const ClientWindowId& window_id,
|
| mojom::WindowTreeClientPtr client,
|
| uint32_t policy_bitmask,
|
| ConnectionSpecificId* connection_id) {
|
| *connection_id = kInvalidConnectionId;
|
| if (!client || !CanEmbed(window_id, policy_bitmask))
|
| return false;
|
| - PrepareForEmbed(window_id);
|
| + ServerWindow* window = GetWindowByClientId(window_id);
|
| + PrepareForEmbed(window);
|
| WindowTreeImpl* new_connection = connection_manager_->EmbedAtWindow(
|
| - GetWindow(window_id), policy_bitmask, std::move(client));
|
| + window, policy_bitmask, std::move(client));
|
| if (is_embed_root_)
|
| *connection_id = new_connection->id();
|
| return true;
|
| @@ -259,40 +285,23 @@ bool WindowTreeImpl::IsWaitingForNewTopLevelWindow(uint32_t wm_change_id) {
|
| void WindowTreeImpl::OnWindowManagerCreatedTopLevelWindow(
|
| uint32_t wm_change_id,
|
| uint32_t client_change_id,
|
| - const WindowId& window_id) {
|
| + const ServerWindow* window) {
|
| DCHECK(IsWaitingForNewTopLevelWindow(wm_change_id));
|
| scoped_ptr<WaitingForTopLevelWindowInfo> waiting_for_top_level_window_info(
|
| std::move(waiting_for_top_level_window_info_));
|
| connection_manager_->GetClientConnection(this)
|
| ->SetIncomingMethodCallProcessingPaused(false);
|
| - embed_to_real_id_map_[waiting_for_top_level_window_info->window_id] =
|
| - window_id;
|
| - std::vector<const ServerWindow*> unused;
|
| - const ServerWindow* window = GetWindow(window_id);
|
| + // We were paused, so the id should still be valid.
|
| + DCHECK(IsValidIdForNewWindow(
|
| + waiting_for_top_level_window_info->client_window_id));
|
| + client_id_to_window_id_map_[waiting_for_top_level_window_info
|
| + ->client_window_id] = window->id();
|
| + window_id_to_client_id_map_[window->id()] =
|
| + waiting_for_top_level_window_info->client_window_id;
|
| roots_.insert(window);
|
| - GetUnknownWindowsFrom(window, &unused);
|
| client_->OnTopLevelCreated(client_change_id, WindowToWindowData(window));
|
| }
|
|
|
| -WindowId WindowTreeImpl::MapWindowIdFromClient(const WindowId& id) const {
|
| - auto iter = embed_to_real_id_map_.find(id);
|
| - return iter == embed_to_real_id_map_.end() ? id : iter->second;
|
| -}
|
| -
|
| -Id WindowTreeImpl::MapWindowIdToClient(const ServerWindow* window) const {
|
| - return MapWindowIdToClient(window ? window->id() : WindowId());
|
| -}
|
| -
|
| -Id WindowTreeImpl::MapWindowIdToClient(const WindowId& id) const {
|
| - // Clients typically don't have many embed windows, so we don't maintain an
|
| - // inverse mapping.
|
| - for (const auto& pair : embed_to_real_id_map_) {
|
| - if (pair.second == id)
|
| - return WindowIdToTransportId(pair.first);
|
| - }
|
| - return WindowIdToTransportId(id);
|
| -}
|
| -
|
| void WindowTreeImpl::OnChangeCompleted(uint32_t change_id, bool success) {
|
| client_->OnChangeCompleted(change_id, success);
|
| }
|
| @@ -301,10 +310,10 @@ void WindowTreeImpl::ProcessWindowBoundsChanged(const ServerWindow* window,
|
| const gfx::Rect& old_bounds,
|
| const gfx::Rect& new_bounds,
|
| bool originated_change) {
|
| - if (originated_change || !IsWindowKnown(window))
|
| + ClientWindowId client_window_id;
|
| + if (originated_change || !IsWindowKnown(window, &client_window_id))
|
| return;
|
| - client_->OnWindowBoundsChanged(MapWindowIdToClient(window),
|
| - Rect::From(old_bounds),
|
| + client_->OnWindowBoundsChanged(client_window_id.id, Rect::From(old_bounds),
|
| Rect::From(new_bounds));
|
| }
|
|
|
| @@ -313,10 +322,11 @@ void WindowTreeImpl::ProcessClientAreaChanged(
|
| const gfx::Insets& new_client_area,
|
| const std::vector<gfx::Rect>& new_additional_client_areas,
|
| bool originated_change) {
|
| - if (originated_change || !IsWindowKnown(window))
|
| + ClientWindowId client_window_id;
|
| + if (originated_change || !IsWindowKnown(window, &client_window_id))
|
| return;
|
| client_->OnClientAreaChanged(
|
| - MapWindowIdToClient(window), mojo::Insets::From(new_client_area),
|
| + client_window_id.id, mojo::Insets::From(new_client_area),
|
| mojo::Array<mojo::RectPtr>::From(new_additional_client_areas));
|
| }
|
|
|
| @@ -327,8 +337,12 @@ void WindowTreeImpl::ProcessViewportMetricsChanged(
|
| bool originated_change) {
|
| mojo::Array<Id> window_ids;
|
| for (const ServerWindow* root : roots_) {
|
| - if (GetHost(root) == host)
|
| - window_ids.push_back(MapWindowIdToClient(root->id()));
|
| + if (GetHost(root) == host) {
|
| + ClientWindowId client_window_id;
|
| + const bool known = IsWindowKnown(root, &client_window_id);
|
| + DCHECK(known);
|
| + window_ids.push_back(client_window_id.id);
|
| + }
|
| }
|
| if (window_ids.size() == 0u)
|
| return;
|
| @@ -362,12 +376,16 @@ void WindowTreeImpl::ProcessWindowPropertyChanged(
|
| if (originated_change)
|
| return;
|
|
|
| + ClientWindowId client_window_id;
|
| + if (!IsWindowKnown(window, &client_window_id))
|
| + return;
|
| +
|
| Array<uint8_t> data;
|
| if (new_data)
|
| data = Array<uint8_t>::From(*new_data);
|
|
|
| - client_->OnWindowSharedPropertyChanged(MapWindowIdToClient(window),
|
| - String(name), std::move(data));
|
| + client_->OnWindowSharedPropertyChanged(client_window_id.id, String(name),
|
| + std::move(data));
|
| }
|
|
|
| void WindowTreeImpl::ProcessWindowHierarchyChanged(
|
| @@ -396,11 +414,15 @@ void WindowTreeImpl::ProcessWindowHierarchyChanged(
|
| std::vector<const ServerWindow*> to_send;
|
| if (!IsWindowKnown(window))
|
| GetUnknownWindowsFrom(window, &to_send);
|
| - const WindowId new_parent_id(new_parent ? new_parent->id() : WindowId());
|
| - const WindowId old_parent_id(old_parent ? old_parent->id() : WindowId());
|
| + const ClientWindowId new_parent_client_window_id =
|
| + new_parent ? ClientWindowIdForWindow(new_parent) : ClientWindowId();
|
| + const ClientWindowId old_parent_client_window_id =
|
| + old_parent ? ClientWindowIdForWindow(old_parent) : ClientWindowId();
|
| + const ClientWindowId client_window_id =
|
| + window ? ClientWindowIdForWindow(window) : ClientWindowId();
|
| client_->OnWindowHierarchyChanged(
|
| - MapWindowIdToClient(window), MapWindowIdToClient(new_parent_id),
|
| - MapWindowIdToClient(old_parent_id), WindowsToWindowDatas(to_send));
|
| + client_window_id.id, new_parent_client_window_id.id,
|
| + old_parent_client_window_id.id, WindowsToWindowDatas(to_send));
|
| connection_manager_->OnConnectionMessagedClient(id_);
|
| }
|
|
|
| @@ -409,8 +431,9 @@ void WindowTreeImpl::ProcessWindowReorder(const ServerWindow* window,
|
| mojom::OrderDirection direction,
|
| bool originated_change) {
|
| DCHECK_EQ(window->parent(), relative_window->parent());
|
| - if (originated_change || !IsWindowKnown(window) ||
|
| - !IsWindowKnown(relative_window) ||
|
| + ClientWindowId client_window_id, relative_client_window_id;
|
| + if (originated_change || !IsWindowKnown(window, &client_window_id) ||
|
| + !IsWindowKnown(relative_window, &relative_client_window_id) ||
|
| connection_manager_->DidConnectionMessageClient(id_))
|
| return;
|
|
|
| @@ -420,31 +443,30 @@ void WindowTreeImpl::ProcessWindowReorder(const ServerWindow* window,
|
| if (HasRoot(window) || HasRoot(relative_window))
|
| return;
|
|
|
| - client_->OnWindowReordered(MapWindowIdToClient(window),
|
| - MapWindowIdToClient(relative_window), direction);
|
| + client_->OnWindowReordered(client_window_id.id, relative_client_window_id.id,
|
| + direction);
|
| connection_manager_->OnConnectionMessagedClient(id_);
|
| }
|
|
|
| void WindowTreeImpl::ProcessWindowDeleted(const ServerWindow* window,
|
| bool originated_change) {
|
| if (window->id().connection_id == id_)
|
| - window_map_.erase(window->id().window_id);
|
| -
|
| - const Id transport_id = MapWindowIdToClient(window);
|
| + created_window_map_.erase(window->id());
|
|
|
| - const bool in_known =
|
| - known_windows_.erase(WindowIdToTransportId(window->id())) > 0;
|
| + ClientWindowId client_window_id;
|
| + if (!IsWindowKnown(window, &client_window_id))
|
| + return;
|
|
|
| if (HasRoot(window))
|
| RemoveRoot(window, RemoveRootReason::DELETED);
|
| + else
|
| + RemoveFromMaps(window);
|
|
|
| if (originated_change)
|
| return;
|
|
|
| - if (in_known) {
|
| - client_->OnWindowDeleted(transport_id);
|
| - connection_manager_->OnConnectionMessagedClient(id_);
|
| - }
|
| + client_->OnWindowDeleted(client_window_id.id);
|
| + connection_manager_->OnConnectionMessagedClient(id_);
|
| }
|
|
|
| void WindowTreeImpl::ProcessWillChangeWindowVisibility(
|
| @@ -453,9 +475,9 @@ void WindowTreeImpl::ProcessWillChangeWindowVisibility(
|
| if (originated_change)
|
| return;
|
|
|
| - if (IsWindowKnown(window)) {
|
| - client_->OnWindowVisibilityChanged(MapWindowIdToClient(window),
|
| - !window->visible());
|
| + ClientWindowId client_window_id;
|
| + if (IsWindowKnown(window, &client_window_id)) {
|
| + client_->OnWindowVisibilityChanged(client_window_id.id, !window->visible());
|
| return;
|
| }
|
|
|
| @@ -476,7 +498,11 @@ void WindowTreeImpl::ProcessCursorChanged(const ServerWindow* window,
|
| bool originated_change) {
|
| if (originated_change)
|
| return;
|
| - client_->OnWindowPredefinedCursorChanged(MapWindowIdToClient(window),
|
| + ClientWindowId client_window_id;
|
| + if (!IsWindowKnown(window, &client_window_id))
|
| + return;
|
| +
|
| + client_->OnWindowPredefinedCursorChanged(client_window_id.id,
|
| mojom::Cursor(cursor_id));
|
| }
|
|
|
| @@ -487,8 +513,12 @@ void WindowTreeImpl::ProcessFocusChanged(
|
| new_focused_window
|
| ? access_policy_->GetWindowForFocusChange(new_focused_window)
|
| : nullptr;
|
| - client_->OnWindowFocused(window ? MapWindowIdToClient(window)
|
| - : MapWindowIdToClient(WindowId()));
|
| + ClientWindowId client_window_id;
|
| + // If the window isn't known we'll supply null, which is ok.
|
| + IsWindowKnown(window, &client_window_id);
|
| + // TODO(sky): this should only notify if this results in a change of focus
|
| + // for the client.
|
| + client_->OnWindowFocused(client_window_id.id);
|
| }
|
|
|
| void WindowTreeImpl::ProcessTransientWindowAdded(
|
| @@ -497,8 +527,14 @@ void WindowTreeImpl::ProcessTransientWindowAdded(
|
| bool originated_change) {
|
| if (originated_change)
|
| return;
|
| - client_->OnTransientWindowAdded(MapWindowIdToClient(window),
|
| - MapWindowIdToClient(transient_window));
|
| +
|
| + ClientWindowId client_window_id, transient_client_window_id;
|
| + if (!IsWindowKnown(window, &client_window_id) ||
|
| + !IsWindowKnown(transient_window, &transient_client_window_id)) {
|
| + return;
|
| + }
|
| + client_->OnTransientWindowAdded(client_window_id.id,
|
| + transient_client_window_id.id);
|
| }
|
|
|
| void WindowTreeImpl::ProcessTransientWindowRemoved(
|
| @@ -507,8 +543,13 @@ void WindowTreeImpl::ProcessTransientWindowRemoved(
|
| bool originated_change) {
|
| if (originated_change)
|
| return;
|
| - client_->OnTransientWindowRemoved(MapWindowIdToClient(window),
|
| - MapWindowIdToClient(transient_window));
|
| + ClientWindowId client_window_id, transient_client_window_id;
|
| + if (!IsWindowKnown(window, &client_window_id) ||
|
| + !IsWindowKnown(transient_window, &transient_client_window_id)) {
|
| + return;
|
| + }
|
| + client_->OnTransientWindowRemoved(client_window_id.id,
|
| + transient_client_window_id.id);
|
| }
|
|
|
| WindowTreeHostImpl* WindowTreeImpl::GetHostForWindowManager() {
|
| @@ -549,13 +590,27 @@ bool WindowTreeImpl::ShouldRouteToWindowManager(
|
| return is_wm ? false : true;
|
| }
|
|
|
| -bool WindowTreeImpl::IsWindowKnown(const ServerWindow* window) const {
|
| - return known_windows_.count(WindowIdToTransportId(window->id())) > 0;
|
| +ClientWindowId WindowTreeImpl::ClientWindowIdForWindow(
|
| + const ServerWindow* window) const {
|
| + auto iter = window_id_to_client_id_map_.find(window->id());
|
| + DCHECK(iter != window_id_to_client_id_map_.end());
|
| + return iter->second;
|
| +}
|
| +
|
| +bool WindowTreeImpl::IsValidIdForNewWindow(const ClientWindowId& id) const {
|
| + if (is_embed_root_ && WindowIdFromTransportId(id.id).connection_id != id_) {
|
| + // Embed roots see windows created from other connections. If they don't
|
| + // use the connection id when creating windows the client could end up with
|
| + // two windows with the same id. Because of this we restrict the ids such
|
| + // connections can create.
|
| + return false;
|
| + }
|
| + return client_id_to_window_id_map_.count(id) == 0u;
|
| }
|
|
|
| -bool WindowTreeImpl::IsValidIdForNewWindow(const WindowId& id) const {
|
| - return id.connection_id == id_ && embed_to_real_id_map_.count(id) == 0 &&
|
| - window_map_.count(id.window_id) == 0;
|
| +WindowId WindowTreeImpl::GenerateNewWindowId() {
|
| + // TODO(sky): deal with wrapping and uniqueness.
|
| + return WindowId(id_, next_window_id_++);
|
| }
|
|
|
| bool WindowTreeImpl::CanReorderWindow(const ServerWindow* window,
|
| @@ -599,7 +654,17 @@ void WindowTreeImpl::GetUnknownWindowsFrom(
|
| if (IsWindowKnown(window) || !access_policy_->CanGetWindowTree(window))
|
| return;
|
| windows->push_back(window);
|
| - known_windows_.insert(WindowIdToTransportId(window->id()));
|
| + // There are two cases where this gets hit:
|
| + // . During init, in which case using the window id as the client id is
|
| + // fine.
|
| + // . When a window is moved to a parent of a window we know about. This is
|
| + // only encountered for the WM or embed roots. We assume such clients want
|
| + // to see the real id of the window and are only created ClientWindowIds
|
| + // with the connection_id.
|
| + const ClientWindowId client_window_id(WindowIdToTransportId(window->id()));
|
| + DCHECK_EQ(0u, client_id_to_window_id_map_.count(client_window_id));
|
| + client_id_to_window_id_map_[client_window_id] = window->id();
|
| + window_id_to_client_id_map_[window->id()] = client_window_id;
|
| if (!access_policy_->CanDescendIntoWindowForWindowTree(window))
|
| return;
|
| std::vector<const ServerWindow*> children(window->GetChildren());
|
| @@ -607,6 +672,16 @@ void WindowTreeImpl::GetUnknownWindowsFrom(
|
| GetUnknownWindowsFrom(children[i], windows);
|
| }
|
|
|
| +bool WindowTreeImpl::RemoveFromMaps(const ServerWindow* window) {
|
| + auto iter = window_id_to_client_id_map_.find(window->id());
|
| + if (iter == window_id_to_client_id_map_.end())
|
| + return false;
|
| +
|
| + client_id_to_window_id_map_.erase(iter->second);
|
| + window_id_to_client_id_map_.erase(iter);
|
| + return true;
|
| +}
|
| +
|
| void WindowTreeImpl::RemoveFromKnown(
|
| const ServerWindow* window,
|
| std::vector<ServerWindow*>* local_windows) {
|
| @@ -615,7 +690,9 @@ void WindowTreeImpl::RemoveFromKnown(
|
| local_windows->push_back(GetWindow(window->id()));
|
| return;
|
| }
|
| - known_windows_.erase(WindowIdToTransportId(window->id()));
|
| +
|
| + RemoveFromMaps(window);
|
| +
|
| std::vector<const ServerWindow*> children = window->GetChildren();
|
| for (size_t i = 0; i < children.size(); ++i)
|
| RemoveFromKnown(children[i], local_windows);
|
| @@ -625,22 +702,16 @@ void WindowTreeImpl::RemoveRoot(const ServerWindow* window,
|
| RemoveRootReason reason) {
|
| DCHECK(roots_.count(window) > 0);
|
| roots_.erase(window);
|
| - const Id transport_id = MapWindowIdToClient(window);
|
|
|
| - for (auto& pair : embed_to_real_id_map_) {
|
| - if (pair.second == window->id()) {
|
| - embed_to_real_id_map_.erase(pair.first);
|
| - break;
|
| - }
|
| - }
|
| + const ClientWindowId client_window_id(ClientWindowIdForWindow(window));
|
|
|
| // No need to do anything if we created the window.
|
| if (window->id().connection_id == id_)
|
| return;
|
|
|
| if (reason == RemoveRootReason::EMBED) {
|
| - client_->OnUnembed(transport_id);
|
| - client_->OnWindowDeleted(transport_id);
|
| + client_->OnUnembed(client_window_id.id);
|
| + client_->OnWindowDeleted(client_window_id.id);
|
| connection_manager_->OnConnectionMessagedClient(id_);
|
| }
|
|
|
| @@ -667,10 +738,12 @@ mojom::WindowDataPtr WindowTreeImpl::WindowToWindowData(
|
| // If the parent isn't known, it means the parent is not visible to us (not
|
| // in roots), and should not be sent over.
|
| if (parent && !IsWindowKnown(parent))
|
| - parent = NULL;
|
| + parent = nullptr;
|
| mojom::WindowDataPtr window_data(mojom::WindowData::New());
|
| - window_data->parent_id = MapWindowIdToClient(parent);
|
| - window_data->window_id = MapWindowIdToClient(window);
|
| + window_data->parent_id =
|
| + parent ? ClientWindowIdForWindow(parent).id : ClientWindowId().id;
|
| + window_data->window_id =
|
| + window ? ClientWindowIdForWindow(window).id : ClientWindowId().id;
|
| window_data->bounds = Rect::From(window->bounds());
|
| window_data->properties =
|
| mojo::Map<String, Array<uint8_t>>::From(window->properties());
|
| @@ -708,40 +781,39 @@ void WindowTreeImpl::NotifyDrawnStateChanged(const ServerWindow* window,
|
|
|
| for (auto* root : roots_) {
|
| if (window->Contains(root) && (new_drawn_value != root->IsDrawn())) {
|
| - client_->OnWindowDrawnStateChanged(MapWindowIdToClient(root),
|
| + client_->OnWindowDrawnStateChanged(ClientWindowIdForWindow(root).id,
|
| new_drawn_value);
|
| }
|
| }
|
| }
|
|
|
| void WindowTreeImpl::DestroyWindows() {
|
| - if (window_map_.empty())
|
| + if (created_window_map_.empty())
|
| return;
|
|
|
| Operation op(this, connection_manager_, OperationType::DELETE_WINDOW);
|
| // If we get here from the destructor we're not going to get
|
| // ProcessWindowDeleted(). Copy the map and delete from the copy so that we
|
| - // don't have to worry about whether |window_map_| changes or not.
|
| - WindowMap window_map_copy;
|
| - window_map_.swap(window_map_copy);
|
| + // don't have to worry about whether |created_window_map_| changes or not.
|
| + base::hash_map<WindowId, ServerWindow*> created_window_map_copy;
|
| + created_window_map_.swap(created_window_map_copy);
|
| // A sibling can be a transient parent of another window so we detach windows
|
| // from their transient parents to avoid double deletes.
|
| - for (auto& pair : window_map_copy) {
|
| + for (auto& pair : created_window_map_copy) {
|
| ServerWindow* transient_parent = pair.second->transient_parent();
|
| if (transient_parent)
|
| transient_parent->RemoveTransientWindow(pair.second);
|
| }
|
| - STLDeleteValues(&window_map_copy);
|
| + STLDeleteValues(&created_window_map_copy);
|
| }
|
|
|
| -bool WindowTreeImpl::CanEmbed(const WindowId& window_id,
|
| +bool WindowTreeImpl::CanEmbed(const ClientWindowId& window_id,
|
| uint32_t policy_bitmask) const {
|
| - const ServerWindow* window = GetWindow(window_id);
|
| + const ServerWindow* window = GetWindowByClientId(window_id);
|
| return window && access_policy_->CanEmbed(window, policy_bitmask);
|
| }
|
|
|
| -void WindowTreeImpl::PrepareForEmbed(const WindowId& window_id) {
|
| - const ServerWindow* window = GetWindow(window_id);
|
| +void WindowTreeImpl::PrepareForEmbed(ServerWindow* window) {
|
| DCHECK(window);
|
|
|
| // Only allow a node to be the root for one connection.
|
| @@ -749,7 +821,7 @@ void WindowTreeImpl::PrepareForEmbed(const WindowId& window_id) {
|
| connection_manager_->GetConnectionWithRoot(window);
|
|
|
| Operation op(this, connection_manager_, OperationType::EMBED);
|
| - RemoveChildrenAsPartOfEmbed(window_id);
|
| + RemoveChildrenAsPartOfEmbed(window);
|
| if (existing_owner) {
|
| // Never message the originating connection.
|
| connection_manager_->OnConnectionMessagedClient(id_);
|
| @@ -757,10 +829,8 @@ void WindowTreeImpl::PrepareForEmbed(const WindowId& window_id) {
|
| }
|
| }
|
|
|
| -void WindowTreeImpl::RemoveChildrenAsPartOfEmbed(const WindowId& window_id) {
|
| - ServerWindow* window = GetWindow(window_id);
|
| +void WindowTreeImpl::RemoveChildrenAsPartOfEmbed(ServerWindow* window) {
|
| CHECK(window);
|
| - CHECK(window->id().connection_id == window_id.connection_id);
|
| std::vector<ServerWindow*> children = window->GetChildren();
|
| for (size_t i = 0; i < children.size(); ++i)
|
| window->Remove(children[i]);
|
| @@ -777,7 +847,7 @@ void WindowTreeImpl::DispatchInputEventImpl(ServerWindow* target,
|
| event_source_host_ = GetHost(target);
|
| // Should only get events from windows attached to a host.
|
| DCHECK(event_source_host_);
|
| - client_->OnWindowInputEvent(event_ack_id_, MapWindowIdToClient(target),
|
| + client_->OnWindowInputEvent(event_ack_id_, ClientWindowIdForWindow(target).id,
|
| std::move(event));
|
| }
|
|
|
| @@ -791,8 +861,7 @@ void WindowTreeImpl::NewWindow(
|
| transport_properties.To<std::map<std::string, std::vector<uint8_t>>>();
|
| }
|
| client_->OnChangeCompleted(
|
| - change_id,
|
| - NewWindow(MapWindowIdFromClient(transport_window_id), properties));
|
| + change_id, NewWindow(ClientWindowId(transport_window_id), properties));
|
| }
|
|
|
| void WindowTreeImpl::NewTopLevelWindow(
|
| @@ -800,12 +869,12 @@ void WindowTreeImpl::NewTopLevelWindow(
|
| Id transport_window_id,
|
| mojo::Map<mojo::String, mojo::Array<uint8_t>> transport_properties) {
|
| DCHECK(!waiting_for_top_level_window_info_);
|
| - const WindowId window_id(MapWindowIdFromClient(transport_window_id));
|
| + const ClientWindowId client_window_id(transport_window_id);
|
| // TODO(sky): need a way for client to provide context.
|
| WindowTreeHostImpl* tree_host =
|
| connection_manager_->GetActiveWindowTreeHost();
|
| if (!tree_host || tree_host->GetWindowTree() == this ||
|
| - !IsValidIdForNewWindow(window_id)) {
|
| + !IsValidIdForNewWindow(client_window_id)) {
|
| client_->OnChangeCompleted(change_id, false);
|
| return;
|
| }
|
| @@ -821,14 +890,15 @@ void WindowTreeImpl::NewTopLevelWindow(
|
| connection_manager_->GenerateWindowManagerChangeId(this, change_id);
|
|
|
| waiting_for_top_level_window_info_.reset(
|
| - new WaitingForTopLevelWindowInfo(window_id, wm_change_id));
|
| + new WaitingForTopLevelWindowInfo(client_window_id, wm_change_id));
|
|
|
| tree_host->GetWindowTree()->window_manager_internal_->WmCreateTopLevelWindow(
|
| wm_change_id, std::move(transport_properties));
|
| }
|
|
|
| void WindowTreeImpl::DeleteWindow(uint32_t change_id, Id transport_window_id) {
|
| - ServerWindow* window = GetWindow(MapWindowIdFromClient(transport_window_id));
|
| + ServerWindow* window =
|
| + GetWindowByClientId(ClientWindowId(transport_window_id));
|
| bool success = false;
|
| bool should_close = window && (access_policy_->CanDeleteWindow(window) ||
|
| ShouldRouteToWindowManager(window));
|
| @@ -841,14 +911,13 @@ void WindowTreeImpl::DeleteWindow(uint32_t change_id, Id transport_window_id) {
|
| }
|
|
|
| void WindowTreeImpl::AddWindow(uint32_t change_id, Id parent_id, Id child_id) {
|
| - client_->OnChangeCompleted(change_id,
|
| - AddWindow(MapWindowIdFromClient(parent_id),
|
| - MapWindowIdFromClient(child_id)));
|
| + client_->OnChangeCompleted(change_id, AddWindow(ClientWindowId(parent_id),
|
| + ClientWindowId(child_id)));
|
| }
|
|
|
| void WindowTreeImpl::RemoveWindowFromParent(uint32_t change_id, Id window_id) {
|
| bool success = false;
|
| - ServerWindow* window = GetWindow(MapWindowIdFromClient(window_id));
|
| + ServerWindow* window = GetWindowByClientId(ClientWindowId(window_id));
|
| if (window && window->parent() &&
|
| access_policy_->CanRemoveWindowFromParent(window)) {
|
| success = true;
|
| @@ -863,16 +932,16 @@ void WindowTreeImpl::AddTransientWindow(uint32_t change_id,
|
| Id window,
|
| Id transient_window) {
|
| client_->OnChangeCompleted(
|
| - change_id, AddTransientWindow(MapWindowIdFromClient(window),
|
| - MapWindowIdFromClient(transient_window)));
|
| + change_id, AddTransientWindow(ClientWindowId(window),
|
| + ClientWindowId(transient_window)));
|
| }
|
|
|
| void WindowTreeImpl::RemoveTransientWindowFromParent(uint32_t change_id,
|
| Id transient_window_id) {
|
| bool success = false;
|
| ServerWindow* transient_window =
|
| - GetWindow(MapWindowIdFromClient(transient_window_id));
|
| - if (transient_window->transient_parent() &&
|
| + GetWindowByClientId(ClientWindowId(transient_window_id));
|
| + if (transient_window && transient_window->transient_parent() &&
|
| access_policy_->CanRemoveTransientWindowFromParent(transient_window)) {
|
| success = true;
|
| Operation op(this, connection_manager_,
|
| @@ -888,9 +957,9 @@ void WindowTreeImpl::ReorderWindow(uint32_t change_id,
|
| Id relative_window_id,
|
| mojom::OrderDirection direction) {
|
| bool success = false;
|
| - ServerWindow* window = GetWindow(MapWindowIdFromClient(window_id));
|
| + ServerWindow* window = GetWindowByClientId(ClientWindowId(window_id));
|
| ServerWindow* relative_window =
|
| - GetWindow(MapWindowIdFromClient(relative_window_id));
|
| + GetWindowByClientId(ClientWindowId(relative_window_id));
|
| if (CanReorderWindow(window, relative_window, direction)) {
|
| success = true;
|
| Operation op(this, connection_manager_, OperationType::REORDER_WINDOW);
|
| @@ -905,21 +974,23 @@ void WindowTreeImpl::GetWindowTree(
|
| Id window_id,
|
| const Callback<void(Array<mojom::WindowDataPtr>)>& callback) {
|
| std::vector<const ServerWindow*> windows(
|
| - GetWindowTree(MapWindowIdFromClient(window_id)));
|
| + GetWindowTree(ClientWindowId(window_id)));
|
| callback.Run(WindowsToWindowDatas(windows));
|
| }
|
|
|
| void WindowTreeImpl::SetWindowBounds(uint32_t change_id,
|
| Id window_id,
|
| mojo::RectPtr bounds) {
|
| - ServerWindow* window = GetWindow(MapWindowIdFromClient(window_id));
|
| + ServerWindow* window = GetWindowByClientId(ClientWindowId(window_id));
|
| if (window && ShouldRouteToWindowManager(window)) {
|
| const uint32_t wm_change_id =
|
| connection_manager_->GenerateWindowManagerChangeId(this, change_id);
|
| // |window_id| may be a client id, use the id from the window to ensure
|
| // the windowmanager doesn't get an id it doesn't know about.
|
| - GetHost(window)->GetWindowTree()->window_manager_internal_->WmSetBounds(
|
| - wm_change_id, WindowIdToTransportId(window->id()), std::move(bounds));
|
| + WindowTreeImpl* wm_window_tree = GetHost(window)->GetWindowTree();
|
| + wm_window_tree->window_manager_internal_->WmSetBounds(
|
| + wm_change_id, wm_window_tree->ClientWindowIdForWindow(window).id,
|
| + std::move(bounds));
|
| return;
|
| }
|
|
|
| @@ -937,19 +1008,21 @@ void WindowTreeImpl::SetWindowVisibility(uint32_t change_id,
|
| bool visible) {
|
| client_->OnChangeCompleted(
|
| change_id,
|
| - SetWindowVisibility(MapWindowIdFromClient(transport_window_id), visible));
|
| + SetWindowVisibility(ClientWindowId(transport_window_id), visible));
|
| }
|
|
|
| void WindowTreeImpl::SetWindowProperty(uint32_t change_id,
|
| Id transport_window_id,
|
| const mojo::String& name,
|
| mojo::Array<uint8_t> value) {
|
| - ServerWindow* window = GetWindow(MapWindowIdFromClient(transport_window_id));
|
| + ServerWindow* window =
|
| + GetWindowByClientId(ClientWindowId(transport_window_id));
|
| if (window && ShouldRouteToWindowManager(window)) {
|
| const uint32_t wm_change_id =
|
| connection_manager_->GenerateWindowManagerChangeId(this, change_id);
|
| - GetHost(window)->GetWindowTree()->window_manager_internal_->WmSetProperty(
|
| - wm_change_id, WindowIdToTransportId(window->id()), name,
|
| + WindowTreeImpl* wm_window_tree = GetHost(window)->GetWindowTree();
|
| + wm_window_tree->window_manager_internal_->WmSetProperty(
|
| + wm_change_id, wm_window_tree->ClientWindowIdForWindow(window).id, name,
|
| std::move(value));
|
| return;
|
| }
|
| @@ -971,7 +1044,8 @@ void WindowTreeImpl::AttachSurface(
|
| mojom::SurfaceType type,
|
| mojo::InterfaceRequest<mojom::Surface> surface,
|
| mojom::SurfaceClientPtr client) {
|
| - ServerWindow* window = GetWindow(MapWindowIdFromClient(transport_window_id));
|
| + ServerWindow* window =
|
| + GetWindowByClientId(ClientWindowId(transport_window_id));
|
| const bool success =
|
| window && access_policy_->CanSetWindowSurface(window, type);
|
| if (!success)
|
| @@ -981,7 +1055,8 @@ void WindowTreeImpl::AttachSurface(
|
|
|
| void WindowTreeImpl::SetWindowTextInputState(Id transport_window_id,
|
| mojo::TextInputStatePtr state) {
|
| - ServerWindow* window = GetWindow(MapWindowIdFromClient(transport_window_id));
|
| + ServerWindow* window =
|
| + GetWindowByClientId(ClientWindowId(transport_window_id));
|
| bool success = window && access_policy_->CanSetWindowTextInputState(window);
|
| if (success)
|
| window->SetTextInputState(state.To<ui::TextInputState>());
|
| @@ -990,7 +1065,8 @@ void WindowTreeImpl::SetWindowTextInputState(Id transport_window_id,
|
| void WindowTreeImpl::SetImeVisibility(Id transport_window_id,
|
| bool visible,
|
| mojo::TextInputStatePtr state) {
|
| - ServerWindow* window = GetWindow(MapWindowIdFromClient(transport_window_id));
|
| + ServerWindow* window =
|
| + GetWindowByClientId(ClientWindowId(transport_window_id));
|
| bool success = window && access_policy_->CanSetWindowTextInputState(window);
|
| if (success) {
|
| if (!state.is_null())
|
| @@ -1034,7 +1110,8 @@ void WindowTreeImpl::SetClientArea(
|
| Id transport_window_id,
|
| mojo::InsetsPtr insets,
|
| mojo::Array<mojo::RectPtr> transport_additional_client_areas) {
|
| - ServerWindow* window = GetWindow(MapWindowIdFromClient(transport_window_id));
|
| + ServerWindow* window =
|
| + GetWindowByClientId(ClientWindowId(transport_window_id));
|
| if (!window || !access_policy_->CanSetClientArea(window))
|
| return;
|
|
|
| @@ -1048,13 +1125,14 @@ void WindowTreeImpl::Embed(Id transport_window_id,
|
| uint32_t policy_bitmask,
|
| const EmbedCallback& callback) {
|
| ConnectionSpecificId connection_id = kInvalidConnectionId;
|
| - const bool result = Embed(MapWindowIdFromClient(transport_window_id),
|
| + const bool result = Embed(ClientWindowId(transport_window_id),
|
| std::move(client), policy_bitmask, &connection_id);
|
| callback.Run(result, connection_id);
|
| }
|
|
|
| void WindowTreeImpl::SetFocus(uint32_t change_id, Id transport_window_id) {
|
| - ServerWindow* window = GetWindow(MapWindowIdFromClient(transport_window_id));
|
| + ServerWindow* window =
|
| + GetWindowByClientId(ClientWindowId(transport_window_id));
|
| // TODO(beng): consider shifting non-policy drawn check logic to VTH's
|
| // FocusController.
|
| // TODO(sky): this doesn't work to clear focus. That is because if window is
|
| @@ -1070,7 +1148,8 @@ void WindowTreeImpl::SetFocus(uint32_t change_id, Id transport_window_id) {
|
| }
|
|
|
| void WindowTreeImpl::SetCanFocus(Id transport_window_id, bool can_focus) {
|
| - ServerWindow* window = GetWindow(MapWindowIdFromClient(transport_window_id));
|
| + ServerWindow* window =
|
| + GetWindowByClientId(ClientWindowId(transport_window_id));
|
| // TODO(sky): there should be an else case (it shouldn't route to wm and
|
| // policy allows, then set_can_focus).
|
| if (window && ShouldRouteToWindowManager(window))
|
| @@ -1080,7 +1159,8 @@ void WindowTreeImpl::SetCanFocus(Id transport_window_id, bool can_focus) {
|
| void WindowTreeImpl::SetPredefinedCursor(uint32_t change_id,
|
| Id transport_window_id,
|
| mus::mojom::Cursor cursor_id) {
|
| - ServerWindow* window = GetWindow(MapWindowIdFromClient(transport_window_id));
|
| + ServerWindow* window =
|
| + GetWindowByClientId(ClientWindowId(transport_window_id));
|
|
|
| // Only the owner of the window can change the bounds.
|
| bool success = window && access_policy_->CanSetCursorProperties(window);
|
| @@ -1118,11 +1198,13 @@ void WindowTreeImpl::WmRequestClose(Id transport_window_id) {
|
| if (!host)
|
| return;
|
|
|
| - ServerWindow* window = GetWindow(MapWindowIdFromClient(transport_window_id));
|
| + ServerWindow* window =
|
| + GetWindowByClientId(ClientWindowId(transport_window_id));
|
| WindowTreeImpl* connection =
|
| connection_manager_->GetConnectionWithRoot(window);
|
| if (connection && connection != host->GetWindowTree())
|
| - connection->client_->RequestClose(connection->MapWindowIdToClient(window));
|
| + connection->client_->RequestClose(
|
| + connection->ClientWindowIdForWindow(window).id);
|
| // TODO(sky): think about what else case means.
|
| }
|
|
|
| @@ -1135,8 +1217,14 @@ void WindowTreeImpl::WmSetFrameDecorationValues(
|
| void WindowTreeImpl::OnWmCreatedTopLevelWindow(uint32_t change_id,
|
| Id transport_window_id) {
|
| if (GetHostForWindowManager()) {
|
| - connection_manager_->WindowManagerCreatedTopLevelWindow(
|
| - this, change_id, transport_window_id);
|
| + ServerWindow* window =
|
| + GetWindowByClientId(ClientWindowId(transport_window_id));
|
| + if (window && window->id().connection_id != id_) {
|
| + connection_manager_->WindowManagerSentBogusMessage();
|
| + window = nullptr;
|
| + }
|
| + connection_manager_->WindowManagerCreatedTopLevelWindow(this, change_id,
|
| + window);
|
| }
|
| // TODO(sky): think about what else case means.
|
| }
|
|
|