Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(450)

Side by Side Diff: components/mus/ws/window_tree_impl.cc

Issue 1639223003: Makes it so each windowtreeclient can use whatever ids it wants (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: cleanup Created 4 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « components/mus/ws/window_tree_impl.h ('k') | components/mus/ws/window_tree_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "components/mus/ws/window_tree_impl.h" 5 #include "components/mus/ws/window_tree_impl.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 #include <utility> 8 #include <utility>
9 9
10 #include "base/bind.h" 10 #include "base/bind.h"
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
60 mojom::EventPtr event_; 60 mojom::EventPtr event_;
61 61
62 DISALLOW_COPY_AND_ASSIGN(TargetedEvent); 62 DISALLOW_COPY_AND_ASSIGN(TargetedEvent);
63 }; 63 };
64 64
65 WindowTreeImpl::WindowTreeImpl(ConnectionManager* connection_manager, 65 WindowTreeImpl::WindowTreeImpl(ConnectionManager* connection_manager,
66 ServerWindow* root, 66 ServerWindow* root,
67 uint32_t policy_bitmask) 67 uint32_t policy_bitmask)
68 : connection_manager_(connection_manager), 68 : connection_manager_(connection_manager),
69 id_(connection_manager_->GetAndAdvanceNextConnectionId()), 69 id_(connection_manager_->GetAndAdvanceNextConnectionId()),
70 next_window_id_(1),
70 client_(nullptr), 71 client_(nullptr),
71 event_ack_id_(0), 72 event_ack_id_(0),
72 event_source_host_(nullptr), 73 event_source_host_(nullptr),
73 is_embed_root_(false), 74 is_embed_root_(false),
74 window_manager_internal_(nullptr) { 75 window_manager_internal_(nullptr) {
75 CHECK(root); 76 CHECK(root);
76 roots_.insert(root); 77 roots_.insert(root);
77 if (root->GetRoot() == root) { 78 if (root->GetRoot() == root) {
78 access_policy_.reset(new WindowManagerAccessPolicy(id_, this)); 79 access_policy_.reset(new WindowManagerAccessPolicy(id_, this));
79 is_embed_root_ = true; 80 is_embed_root_ = true;
(...skipping 13 matching lines...) Expand all
93 client_ = client; 94 client_ = client;
94 std::vector<const ServerWindow*> to_send; 95 std::vector<const ServerWindow*> to_send;
95 CHECK_EQ(1u, roots_.size()); 96 CHECK_EQ(1u, roots_.size());
96 GetUnknownWindowsFrom(*roots_.begin(), &to_send); 97 GetUnknownWindowsFrom(*roots_.begin(), &to_send);
97 98
98 WindowTreeHostImpl* host = GetHost(*roots_.begin()); 99 WindowTreeHostImpl* host = GetHost(*roots_.begin());
99 const ServerWindow* focused_window = 100 const ServerWindow* focused_window =
100 host ? host->GetFocusedWindow() : nullptr; 101 host ? host->GetFocusedWindow() : nullptr;
101 if (focused_window) 102 if (focused_window)
102 focused_window = access_policy_->GetWindowForFocusChange(focused_window); 103 focused_window = access_policy_->GetWindowForFocusChange(focused_window);
103 const Id focused_window_transport_id(MapWindowIdToClient(focused_window)); 104 ClientWindowId focused_window_id;
105 if (focused_window)
106 IsWindowKnown(focused_window, &focused_window_id);
104 107
105 client->OnEmbed(id_, WindowToWindowData(to_send.front()), std::move(tree), 108 client->OnEmbed(id_, WindowToWindowData(to_send.front()), std::move(tree),
106 focused_window_transport_id, 109 focused_window_id.id,
107 is_embed_root_ ? WindowTree::kAccessPolicyEmbedRoot 110 is_embed_root_ ? WindowTree::kAccessPolicyEmbedRoot
108 : WindowTree::kAccessPolicyDefault); 111 : WindowTree::kAccessPolicyDefault);
109 } 112 }
110 113
111 const ServerWindow* WindowTreeImpl::GetWindow(const WindowId& id) const { 114 const ServerWindow* WindowTreeImpl::GetWindow(const WindowId& id) const {
112 if (id_ == id.connection_id) { 115 if (id_ == id.connection_id) {
113 WindowMap::const_iterator i = window_map_.find(id.window_id); 116 auto iter = created_window_map_.find(id);
114 return i == window_map_.end() ? NULL : i->second; 117 return iter == created_window_map_.end() ? nullptr : iter->second;
115 } 118 }
116 return connection_manager_->GetWindow(id); 119 return connection_manager_->GetWindow(id);
117 } 120 }
118 121
122 bool WindowTreeImpl::IsWindowKnown(const ServerWindow* window,
123 ClientWindowId* id) const {
124 if (!window)
125 return false;
126 auto iter = window_id_to_client_id_map_.find(window->id());
127 if (iter == window_id_to_client_id_map_.end())
128 return false;
129 if (id)
130 *id = iter->second;
131 return true;
132 }
133
119 bool WindowTreeImpl::HasRoot(const ServerWindow* window) const { 134 bool WindowTreeImpl::HasRoot(const ServerWindow* window) const {
120 return roots_.count(window) > 0; 135 return roots_.count(window) > 0;
121 } 136 }
122 137
138 const ServerWindow* WindowTreeImpl::GetWindowByClientId(
139 const ClientWindowId& id) const {
140 auto iter = client_id_to_window_id_map_.find(id);
141 return iter == client_id_to_window_id_map_.end() ? nullptr
142 : GetWindow(iter->second);
143 }
144
123 const WindowTreeHostImpl* WindowTreeImpl::GetHost( 145 const WindowTreeHostImpl* WindowTreeImpl::GetHost(
124 const ServerWindow* window) const { 146 const ServerWindow* window) const {
125 return window ? connection_manager_->GetWindowTreeHostByWindow(window) 147 return window ? connection_manager_->GetWindowTreeHostByWindow(window)
126 : nullptr; 148 : nullptr;
127 } 149 }
128 150
129 void WindowTreeImpl::OnWindowDestroyingTreeImpl(WindowTreeImpl* connection) { 151 void WindowTreeImpl::OnWindowDestroyingTreeImpl(WindowTreeImpl* connection) {
130 // Notify our client if |connection| was embedded in any of our views. 152 // Notify our client if |connection| was embedded in any of our views.
131 for (const auto* connection_root : connection->roots_) { 153 for (const auto* connection_root : connection->roots_) {
132 const bool owns_connection_root = 154 const bool owns_connection_root =
133 connection_root->id().connection_id == id_; 155 connection_root->id().connection_id == id_;
134 const bool knows_about_connection_root = 156 if (owns_connection_root ||
135 window_map_.count(connection_root->id().window_id) > 0;
136 if ((owns_connection_root && knows_about_connection_root) ||
137 (is_embed_root_ && IsWindowKnown(connection_root))) { 157 (is_embed_root_ && IsWindowKnown(connection_root))) {
138 client_->OnEmbeddedAppDisconnected(MapWindowIdToClient(connection_root)); 158 client_->OnEmbeddedAppDisconnected(
159 ClientWindowIdForWindow(connection_root).id);
139 } 160 }
140 } 161 }
141 } 162 }
142 163
143 void WindowTreeImpl::OnWillDestroyWindowTreeHost( 164 void WindowTreeImpl::OnWillDestroyWindowTreeHost(
144 WindowTreeHostImpl* tree_host) { 165 WindowTreeHostImpl* tree_host) {
145 if (event_source_host_ == tree_host) 166 if (event_source_host_ == tree_host)
146 event_source_host_ = nullptr; 167 event_source_host_ = nullptr;
147 } 168 }
148 169
149 void WindowTreeImpl::NotifyChangeCompleted( 170 void WindowTreeImpl::NotifyChangeCompleted(
150 uint32_t change_id, 171 uint32_t change_id,
151 mojom::WindowManagerErrorCode error_code) { 172 mojom::WindowManagerErrorCode error_code) {
152 client_->OnChangeCompleted( 173 client_->OnChangeCompleted(
153 change_id, error_code == mojom::WindowManagerErrorCode::SUCCESS); 174 change_id, error_code == mojom::WindowManagerErrorCode::SUCCESS);
154 } 175 }
155 176
156 bool WindowTreeImpl::NewWindow( 177 bool WindowTreeImpl::NewWindow(
157 const WindowId& window_id, 178 const ClientWindowId& client_window_id,
158 const std::map<std::string, std::vector<uint8_t>>& properties) { 179 const std::map<std::string, std::vector<uint8_t>>& properties) {
159 if (!IsValidIdForNewWindow(window_id)) 180 if (!IsValidIdForNewWindow(client_window_id))
160 return false; 181 return false;
161 window_map_[window_id.window_id] = 182 const WindowId window_id = GenerateNewWindowId();
183 DCHECK(!GetWindow(window_id));
184 ServerWindow* window =
162 connection_manager_->CreateServerWindow(window_id, properties); 185 connection_manager_->CreateServerWindow(window_id, properties);
163 known_windows_.insert(WindowIdToTransportId(window_id)); 186 created_window_map_[window_id] = window;
187 client_id_to_window_id_map_[client_window_id] = window_id;
188 window_id_to_client_id_map_[window_id] = client_window_id;
164 return true; 189 return true;
165 } 190 }
166 191
167 bool WindowTreeImpl::AddWindow(const WindowId& parent_id, 192 bool WindowTreeImpl::AddWindow(const ClientWindowId& parent_id,
168 const WindowId& child_id) { 193 const ClientWindowId& child_id) {
169 ServerWindow* parent = GetWindow(MapWindowIdFromClient(parent_id)); 194 ServerWindow* parent = GetWindowByClientId(parent_id);
170 ServerWindow* child = GetWindow(MapWindowIdFromClient(child_id)); 195 ServerWindow* child = GetWindowByClientId(child_id);
171 if (parent && child && child->parent() != parent && 196 if (parent && child && child->parent() != parent &&
172 !child->Contains(parent) && access_policy_->CanAddWindow(parent, child)) { 197 !child->Contains(parent) && access_policy_->CanAddWindow(parent, child)) {
173 Operation op(this, connection_manager_, OperationType::ADD_WINDOW); 198 Operation op(this, connection_manager_, OperationType::ADD_WINDOW);
174 parent->Add(child); 199 parent->Add(child);
175 return true; 200 return true;
176 } 201 }
177 return false; 202 return false;
178 } 203 }
179 204
180 bool WindowTreeImpl::AddTransientWindow(const WindowId& window_id, 205 bool WindowTreeImpl::AddTransientWindow(
181 const WindowId& transient_window_id) { 206 const ClientWindowId& window_id,
182 ServerWindow* window = GetWindow(MapWindowIdFromClient(window_id)); 207 const ClientWindowId& transient_window_id) {
183 ServerWindow* transient_window = 208 ServerWindow* window = GetWindowByClientId(window_id);
184 GetWindow(MapWindowIdFromClient(transient_window_id)); 209 ServerWindow* transient_window = GetWindowByClientId(transient_window_id);
185 if (window && transient_window && !transient_window->Contains(window) && 210 if (window && transient_window && !transient_window->Contains(window) &&
186 access_policy_->CanAddTransientWindow(window, transient_window)) { 211 access_policy_->CanAddTransientWindow(window, transient_window)) {
187 Operation op(this, connection_manager_, 212 Operation op(this, connection_manager_,
188 OperationType::ADD_TRANSIENT_WINDOW); 213 OperationType::ADD_TRANSIENT_WINDOW);
189 window->AddTransientWindow(transient_window); 214 window->AddTransientWindow(transient_window);
190 return true; 215 return true;
191 } 216 }
192 return false; 217 return false;
193 } 218 }
194 219
195 std::vector<const ServerWindow*> WindowTreeImpl::GetWindowTree( 220 std::vector<const ServerWindow*> WindowTreeImpl::GetWindowTree(
196 const WindowId& window_id) const { 221 const ClientWindowId& window_id) const {
197 const ServerWindow* window = GetWindow(window_id); 222 const ServerWindow* window = GetWindowByClientId(window_id);
198 std::vector<const ServerWindow*> windows; 223 std::vector<const ServerWindow*> windows;
199 if (window) 224 if (window)
200 GetWindowTreeImpl(window, &windows); 225 GetWindowTreeImpl(window, &windows);
201 return windows; 226 return windows;
202 } 227 }
203 228
204 bool WindowTreeImpl::SetWindowVisibility(const WindowId& window_id, 229 bool WindowTreeImpl::SetWindowVisibility(const ClientWindowId& window_id,
205 bool visible) { 230 bool visible) {
206 ServerWindow* window = GetWindow(MapWindowIdFromClient(window_id)); 231 ServerWindow* window = GetWindowByClientId(window_id);
207 if (!window || window->visible() == visible || 232 if (!window || window->visible() == visible ||
208 !access_policy_->CanChangeWindowVisibility(window)) { 233 !access_policy_->CanChangeWindowVisibility(window)) {
209 return false; 234 return false;
210 } 235 }
211 Operation op(this, connection_manager_, OperationType::SET_WINDOW_VISIBILITY); 236 Operation op(this, connection_manager_, OperationType::SET_WINDOW_VISIBILITY);
212 window->SetVisible(visible); 237 window->SetVisible(visible);
213 return true; 238 return true;
214 } 239 }
215 240
216 bool WindowTreeImpl::Embed(const WindowId& window_id, 241 bool WindowTreeImpl::Embed(const ClientWindowId& window_id,
217 mojom::WindowTreeClientPtr client, 242 mojom::WindowTreeClientPtr client,
218 uint32_t policy_bitmask, 243 uint32_t policy_bitmask,
219 ConnectionSpecificId* connection_id) { 244 ConnectionSpecificId* connection_id) {
220 *connection_id = kInvalidConnectionId; 245 *connection_id = kInvalidConnectionId;
221 if (!client || !CanEmbed(window_id, policy_bitmask)) 246 if (!client || !CanEmbed(window_id, policy_bitmask))
222 return false; 247 return false;
223 PrepareForEmbed(window_id); 248 ServerWindow* window = GetWindowByClientId(window_id);
249 PrepareForEmbed(window);
224 WindowTreeImpl* new_connection = connection_manager_->EmbedAtWindow( 250 WindowTreeImpl* new_connection = connection_manager_->EmbedAtWindow(
225 GetWindow(window_id), policy_bitmask, std::move(client)); 251 window, policy_bitmask, std::move(client));
226 if (is_embed_root_) 252 if (is_embed_root_)
227 *connection_id = new_connection->id(); 253 *connection_id = new_connection->id();
228 return true; 254 return true;
229 } 255 }
230 256
231 void WindowTreeImpl::DispatchInputEvent(ServerWindow* target, 257 void WindowTreeImpl::DispatchInputEvent(ServerWindow* target,
232 mojom::EventPtr event) { 258 mojom::EventPtr event) {
233 if (event_ack_id_) { 259 if (event_ack_id_) {
234 // This is currently waiting for an event ack. Add it to the queue. 260 // This is currently waiting for an event ack. Add it to the queue.
235 event_queue_.push( 261 event_queue_.push(
(...skipping 16 matching lines...) Expand all
252 } 278 }
253 279
254 bool WindowTreeImpl::IsWaitingForNewTopLevelWindow(uint32_t wm_change_id) { 280 bool WindowTreeImpl::IsWaitingForNewTopLevelWindow(uint32_t wm_change_id) {
255 return waiting_for_top_level_window_info_ && 281 return waiting_for_top_level_window_info_ &&
256 waiting_for_top_level_window_info_->wm_change_id == wm_change_id; 282 waiting_for_top_level_window_info_->wm_change_id == wm_change_id;
257 } 283 }
258 284
259 void WindowTreeImpl::OnWindowManagerCreatedTopLevelWindow( 285 void WindowTreeImpl::OnWindowManagerCreatedTopLevelWindow(
260 uint32_t wm_change_id, 286 uint32_t wm_change_id,
261 uint32_t client_change_id, 287 uint32_t client_change_id,
262 const WindowId& window_id) { 288 const ServerWindow* window) {
263 DCHECK(IsWaitingForNewTopLevelWindow(wm_change_id)); 289 DCHECK(IsWaitingForNewTopLevelWindow(wm_change_id));
264 scoped_ptr<WaitingForTopLevelWindowInfo> waiting_for_top_level_window_info( 290 scoped_ptr<WaitingForTopLevelWindowInfo> waiting_for_top_level_window_info(
265 std::move(waiting_for_top_level_window_info_)); 291 std::move(waiting_for_top_level_window_info_));
266 connection_manager_->GetClientConnection(this) 292 connection_manager_->GetClientConnection(this)
267 ->SetIncomingMethodCallProcessingPaused(false); 293 ->SetIncomingMethodCallProcessingPaused(false);
268 embed_to_real_id_map_[waiting_for_top_level_window_info->window_id] = 294 // We were paused, so the id should still be valid.
269 window_id; 295 DCHECK(IsValidIdForNewWindow(
270 std::vector<const ServerWindow*> unused; 296 waiting_for_top_level_window_info->client_window_id));
271 const ServerWindow* window = GetWindow(window_id); 297 client_id_to_window_id_map_[waiting_for_top_level_window_info
298 ->client_window_id] = window->id();
299 window_id_to_client_id_map_[window->id()] =
300 waiting_for_top_level_window_info->client_window_id;
272 roots_.insert(window); 301 roots_.insert(window);
273 GetUnknownWindowsFrom(window, &unused);
274 client_->OnTopLevelCreated(client_change_id, WindowToWindowData(window)); 302 client_->OnTopLevelCreated(client_change_id, WindowToWindowData(window));
275 } 303 }
276 304
277 WindowId WindowTreeImpl::MapWindowIdFromClient(const WindowId& id) const {
278 auto iter = embed_to_real_id_map_.find(id);
279 return iter == embed_to_real_id_map_.end() ? id : iter->second;
280 }
281
282 Id WindowTreeImpl::MapWindowIdToClient(const ServerWindow* window) const {
283 return MapWindowIdToClient(window ? window->id() : WindowId());
284 }
285
286 Id WindowTreeImpl::MapWindowIdToClient(const WindowId& id) const {
287 // Clients typically don't have many embed windows, so we don't maintain an
288 // inverse mapping.
289 for (const auto& pair : embed_to_real_id_map_) {
290 if (pair.second == id)
291 return WindowIdToTransportId(pair.first);
292 }
293 return WindowIdToTransportId(id);
294 }
295
296 void WindowTreeImpl::OnChangeCompleted(uint32_t change_id, bool success) { 305 void WindowTreeImpl::OnChangeCompleted(uint32_t change_id, bool success) {
297 client_->OnChangeCompleted(change_id, success); 306 client_->OnChangeCompleted(change_id, success);
298 } 307 }
299 308
300 void WindowTreeImpl::ProcessWindowBoundsChanged(const ServerWindow* window, 309 void WindowTreeImpl::ProcessWindowBoundsChanged(const ServerWindow* window,
301 const gfx::Rect& old_bounds, 310 const gfx::Rect& old_bounds,
302 const gfx::Rect& new_bounds, 311 const gfx::Rect& new_bounds,
303 bool originated_change) { 312 bool originated_change) {
304 if (originated_change || !IsWindowKnown(window)) 313 ClientWindowId client_window_id;
314 if (originated_change || !IsWindowKnown(window, &client_window_id))
305 return; 315 return;
306 client_->OnWindowBoundsChanged(MapWindowIdToClient(window), 316 client_->OnWindowBoundsChanged(client_window_id.id, Rect::From(old_bounds),
307 Rect::From(old_bounds),
308 Rect::From(new_bounds)); 317 Rect::From(new_bounds));
309 } 318 }
310 319
311 void WindowTreeImpl::ProcessClientAreaChanged( 320 void WindowTreeImpl::ProcessClientAreaChanged(
312 const ServerWindow* window, 321 const ServerWindow* window,
313 const gfx::Insets& new_client_area, 322 const gfx::Insets& new_client_area,
314 const std::vector<gfx::Rect>& new_additional_client_areas, 323 const std::vector<gfx::Rect>& new_additional_client_areas,
315 bool originated_change) { 324 bool originated_change) {
316 if (originated_change || !IsWindowKnown(window)) 325 ClientWindowId client_window_id;
326 if (originated_change || !IsWindowKnown(window, &client_window_id))
317 return; 327 return;
318 client_->OnClientAreaChanged( 328 client_->OnClientAreaChanged(
319 MapWindowIdToClient(window), mojo::Insets::From(new_client_area), 329 client_window_id.id, mojo::Insets::From(new_client_area),
320 mojo::Array<mojo::RectPtr>::From(new_additional_client_areas)); 330 mojo::Array<mojo::RectPtr>::From(new_additional_client_areas));
321 } 331 }
322 332
323 void WindowTreeImpl::ProcessViewportMetricsChanged( 333 void WindowTreeImpl::ProcessViewportMetricsChanged(
324 WindowTreeHostImpl* host, 334 WindowTreeHostImpl* host,
325 const mojom::ViewportMetrics& old_metrics, 335 const mojom::ViewportMetrics& old_metrics,
326 const mojom::ViewportMetrics& new_metrics, 336 const mojom::ViewportMetrics& new_metrics,
327 bool originated_change) { 337 bool originated_change) {
328 mojo::Array<Id> window_ids; 338 mojo::Array<Id> window_ids;
329 for (const ServerWindow* root : roots_) { 339 for (const ServerWindow* root : roots_) {
330 if (GetHost(root) == host) 340 if (GetHost(root) == host) {
331 window_ids.push_back(MapWindowIdToClient(root->id())); 341 ClientWindowId client_window_id;
342 const bool known = IsWindowKnown(root, &client_window_id);
343 DCHECK(known);
344 window_ids.push_back(client_window_id.id);
345 }
332 } 346 }
333 if (window_ids.size() == 0u) 347 if (window_ids.size() == 0u)
334 return; 348 return;
335 349
336 client_->OnWindowViewportMetricsChanged( 350 client_->OnWindowViewportMetricsChanged(
337 std::move(window_ids), old_metrics.Clone(), new_metrics.Clone()); 351 std::move(window_ids), old_metrics.Clone(), new_metrics.Clone());
338 } 352 }
339 353
340 void WindowTreeImpl::ProcessWillChangeWindowHierarchy( 354 void WindowTreeImpl::ProcessWillChangeWindowHierarchy(
341 const ServerWindow* window, 355 const ServerWindow* window,
(...skipping 13 matching lines...) Expand all
355 } 369 }
356 370
357 void WindowTreeImpl::ProcessWindowPropertyChanged( 371 void WindowTreeImpl::ProcessWindowPropertyChanged(
358 const ServerWindow* window, 372 const ServerWindow* window,
359 const std::string& name, 373 const std::string& name,
360 const std::vector<uint8_t>* new_data, 374 const std::vector<uint8_t>* new_data,
361 bool originated_change) { 375 bool originated_change) {
362 if (originated_change) 376 if (originated_change)
363 return; 377 return;
364 378
379 ClientWindowId client_window_id;
380 if (!IsWindowKnown(window, &client_window_id))
381 return;
382
365 Array<uint8_t> data; 383 Array<uint8_t> data;
366 if (new_data) 384 if (new_data)
367 data = Array<uint8_t>::From(*new_data); 385 data = Array<uint8_t>::From(*new_data);
368 386
369 client_->OnWindowSharedPropertyChanged(MapWindowIdToClient(window), 387 client_->OnWindowSharedPropertyChanged(client_window_id.id, String(name),
370 String(name), std::move(data)); 388 std::move(data));
371 } 389 }
372 390
373 void WindowTreeImpl::ProcessWindowHierarchyChanged( 391 void WindowTreeImpl::ProcessWindowHierarchyChanged(
374 const ServerWindow* window, 392 const ServerWindow* window,
375 const ServerWindow* new_parent, 393 const ServerWindow* new_parent,
376 const ServerWindow* old_parent, 394 const ServerWindow* old_parent,
377 bool originated_change) { 395 bool originated_change) {
378 if (originated_change && !IsWindowKnown(window) && new_parent && 396 if (originated_change && !IsWindowKnown(window) && new_parent &&
379 IsWindowKnown(new_parent)) { 397 IsWindowKnown(new_parent)) {
380 std::vector<const ServerWindow*> unused; 398 std::vector<const ServerWindow*> unused;
381 GetUnknownWindowsFrom(window, &unused); 399 GetUnknownWindowsFrom(window, &unused);
382 } 400 }
383 if (originated_change || (connection_manager_->current_operation_type() == 401 if (originated_change || (connection_manager_->current_operation_type() ==
384 OperationType::DELETE_WINDOW) || 402 OperationType::DELETE_WINDOW) ||
385 (connection_manager_->current_operation_type() == OperationType::EMBED) || 403 (connection_manager_->current_operation_type() == OperationType::EMBED) ||
386 connection_manager_->DidConnectionMessageClient(id_)) { 404 connection_manager_->DidConnectionMessageClient(id_)) {
387 return; 405 return;
388 } 406 }
389 407
390 if (!access_policy_->ShouldNotifyOnHierarchyChange(window, &new_parent, 408 if (!access_policy_->ShouldNotifyOnHierarchyChange(window, &new_parent,
391 &old_parent)) { 409 &old_parent)) {
392 return; 410 return;
393 } 411 }
394 // Inform the client of any new windows and update the set of windows we know 412 // Inform the client of any new windows and update the set of windows we know
395 // about. 413 // about.
396 std::vector<const ServerWindow*> to_send; 414 std::vector<const ServerWindow*> to_send;
397 if (!IsWindowKnown(window)) 415 if (!IsWindowKnown(window))
398 GetUnknownWindowsFrom(window, &to_send); 416 GetUnknownWindowsFrom(window, &to_send);
399 const WindowId new_parent_id(new_parent ? new_parent->id() : WindowId()); 417 const ClientWindowId new_parent_client_window_id =
400 const WindowId old_parent_id(old_parent ? old_parent->id() : WindowId()); 418 new_parent ? ClientWindowIdForWindow(new_parent) : ClientWindowId();
419 const ClientWindowId old_parent_client_window_id =
420 old_parent ? ClientWindowIdForWindow(old_parent) : ClientWindowId();
421 const ClientWindowId client_window_id =
422 window ? ClientWindowIdForWindow(window) : ClientWindowId();
401 client_->OnWindowHierarchyChanged( 423 client_->OnWindowHierarchyChanged(
402 MapWindowIdToClient(window), MapWindowIdToClient(new_parent_id), 424 client_window_id.id, new_parent_client_window_id.id,
403 MapWindowIdToClient(old_parent_id), WindowsToWindowDatas(to_send)); 425 old_parent_client_window_id.id, WindowsToWindowDatas(to_send));
404 connection_manager_->OnConnectionMessagedClient(id_); 426 connection_manager_->OnConnectionMessagedClient(id_);
405 } 427 }
406 428
407 void WindowTreeImpl::ProcessWindowReorder(const ServerWindow* window, 429 void WindowTreeImpl::ProcessWindowReorder(const ServerWindow* window,
408 const ServerWindow* relative_window, 430 const ServerWindow* relative_window,
409 mojom::OrderDirection direction, 431 mojom::OrderDirection direction,
410 bool originated_change) { 432 bool originated_change) {
411 DCHECK_EQ(window->parent(), relative_window->parent()); 433 DCHECK_EQ(window->parent(), relative_window->parent());
412 if (originated_change || !IsWindowKnown(window) || 434 ClientWindowId client_window_id, relative_client_window_id;
413 !IsWindowKnown(relative_window) || 435 if (originated_change || !IsWindowKnown(window, &client_window_id) ||
436 !IsWindowKnown(relative_window, &relative_client_window_id) ||
414 connection_manager_->DidConnectionMessageClient(id_)) 437 connection_manager_->DidConnectionMessageClient(id_))
415 return; 438 return;
416 439
417 // Do not notify ordering changes of the root windows, since the client 440 // Do not notify ordering changes of the root windows, since the client
418 // doesn't know about the ancestors of the roots, and so can't do anything 441 // doesn't know about the ancestors of the roots, and so can't do anything
419 // about this ordering change of the root. 442 // about this ordering change of the root.
420 if (HasRoot(window) || HasRoot(relative_window)) 443 if (HasRoot(window) || HasRoot(relative_window))
421 return; 444 return;
422 445
423 client_->OnWindowReordered(MapWindowIdToClient(window), 446 client_->OnWindowReordered(client_window_id.id, relative_client_window_id.id,
424 MapWindowIdToClient(relative_window), direction); 447 direction);
425 connection_manager_->OnConnectionMessagedClient(id_); 448 connection_manager_->OnConnectionMessagedClient(id_);
426 } 449 }
427 450
428 void WindowTreeImpl::ProcessWindowDeleted(const ServerWindow* window, 451 void WindowTreeImpl::ProcessWindowDeleted(const ServerWindow* window,
429 bool originated_change) { 452 bool originated_change) {
430 if (window->id().connection_id == id_) 453 if (window->id().connection_id == id_)
431 window_map_.erase(window->id().window_id); 454 created_window_map_.erase(window->id());
432 455
433 const Id transport_id = MapWindowIdToClient(window); 456 ClientWindowId client_window_id;
434 457 if (!IsWindowKnown(window, &client_window_id))
435 const bool in_known = 458 return;
436 known_windows_.erase(WindowIdToTransportId(window->id())) > 0;
437 459
438 if (HasRoot(window)) 460 if (HasRoot(window))
439 RemoveRoot(window, RemoveRootReason::DELETED); 461 RemoveRoot(window, RemoveRootReason::DELETED);
462 else
463 RemoveFromMaps(window);
440 464
441 if (originated_change) 465 if (originated_change)
442 return; 466 return;
443 467
444 if (in_known) { 468 client_->OnWindowDeleted(client_window_id.id);
445 client_->OnWindowDeleted(transport_id); 469 connection_manager_->OnConnectionMessagedClient(id_);
446 connection_manager_->OnConnectionMessagedClient(id_);
447 }
448 } 470 }
449 471
450 void WindowTreeImpl::ProcessWillChangeWindowVisibility( 472 void WindowTreeImpl::ProcessWillChangeWindowVisibility(
451 const ServerWindow* window, 473 const ServerWindow* window,
452 bool originated_change) { 474 bool originated_change) {
453 if (originated_change) 475 if (originated_change)
454 return; 476 return;
455 477
456 if (IsWindowKnown(window)) { 478 ClientWindowId client_window_id;
457 client_->OnWindowVisibilityChanged(MapWindowIdToClient(window), 479 if (IsWindowKnown(window, &client_window_id)) {
458 !window->visible()); 480 client_->OnWindowVisibilityChanged(client_window_id.id, !window->visible());
459 return; 481 return;
460 } 482 }
461 483
462 bool window_target_drawn_state; 484 bool window_target_drawn_state;
463 if (window->visible()) { 485 if (window->visible()) {
464 // Window is being hidden, won't be drawn. 486 // Window is being hidden, won't be drawn.
465 window_target_drawn_state = false; 487 window_target_drawn_state = false;
466 } else { 488 } else {
467 // Window is being shown. Window will be drawn if its parent is drawn. 489 // Window is being shown. Window will be drawn if its parent is drawn.
468 window_target_drawn_state = window->parent() && window->parent()->IsDrawn(); 490 window_target_drawn_state = window->parent() && window->parent()->IsDrawn();
469 } 491 }
470 492
471 NotifyDrawnStateChanged(window, window_target_drawn_state); 493 NotifyDrawnStateChanged(window, window_target_drawn_state);
472 } 494 }
473 495
474 void WindowTreeImpl::ProcessCursorChanged(const ServerWindow* window, 496 void WindowTreeImpl::ProcessCursorChanged(const ServerWindow* window,
475 int32_t cursor_id, 497 int32_t cursor_id,
476 bool originated_change) { 498 bool originated_change) {
477 if (originated_change) 499 if (originated_change)
478 return; 500 return;
479 client_->OnWindowPredefinedCursorChanged(MapWindowIdToClient(window), 501 ClientWindowId client_window_id;
502 if (!IsWindowKnown(window, &client_window_id))
503 return;
504
505 client_->OnWindowPredefinedCursorChanged(client_window_id.id,
480 mojom::Cursor(cursor_id)); 506 mojom::Cursor(cursor_id));
481 } 507 }
482 508
483 void WindowTreeImpl::ProcessFocusChanged( 509 void WindowTreeImpl::ProcessFocusChanged(
484 const ServerWindow* old_focused_window, 510 const ServerWindow* old_focused_window,
485 const ServerWindow* new_focused_window) { 511 const ServerWindow* new_focused_window) {
486 const ServerWindow* window = 512 const ServerWindow* window =
487 new_focused_window 513 new_focused_window
488 ? access_policy_->GetWindowForFocusChange(new_focused_window) 514 ? access_policy_->GetWindowForFocusChange(new_focused_window)
489 : nullptr; 515 : nullptr;
490 client_->OnWindowFocused(window ? MapWindowIdToClient(window) 516 ClientWindowId client_window_id;
491 : MapWindowIdToClient(WindowId())); 517 // If the window isn't known we'll supply null, which is ok.
518 IsWindowKnown(window, &client_window_id);
519 // TODO(sky): this should only notify if this results in a change of focus
520 // for the client.
521 client_->OnWindowFocused(client_window_id.id);
492 } 522 }
493 523
494 void WindowTreeImpl::ProcessTransientWindowAdded( 524 void WindowTreeImpl::ProcessTransientWindowAdded(
495 const ServerWindow* window, 525 const ServerWindow* window,
496 const ServerWindow* transient_window, 526 const ServerWindow* transient_window,
497 bool originated_change) { 527 bool originated_change) {
498 if (originated_change) 528 if (originated_change)
499 return; 529 return;
500 client_->OnTransientWindowAdded(MapWindowIdToClient(window), 530
501 MapWindowIdToClient(transient_window)); 531 ClientWindowId client_window_id, transient_client_window_id;
532 if (!IsWindowKnown(window, &client_window_id) ||
533 !IsWindowKnown(transient_window, &transient_client_window_id)) {
534 return;
535 }
536 client_->OnTransientWindowAdded(client_window_id.id,
537 transient_client_window_id.id);
502 } 538 }
503 539
504 void WindowTreeImpl::ProcessTransientWindowRemoved( 540 void WindowTreeImpl::ProcessTransientWindowRemoved(
505 const ServerWindow* window, 541 const ServerWindow* window,
506 const ServerWindow* transient_window, 542 const ServerWindow* transient_window,
507 bool originated_change) { 543 bool originated_change) {
508 if (originated_change) 544 if (originated_change)
509 return; 545 return;
510 client_->OnTransientWindowRemoved(MapWindowIdToClient(window), 546 ClientWindowId client_window_id, transient_client_window_id;
511 MapWindowIdToClient(transient_window)); 547 if (!IsWindowKnown(window, &client_window_id) ||
548 !IsWindowKnown(transient_window, &transient_client_window_id)) {
549 return;
550 }
551 client_->OnTransientWindowRemoved(client_window_id.id,
552 transient_client_window_id.id);
512 } 553 }
513 554
514 WindowTreeHostImpl* WindowTreeImpl::GetHostForWindowManager() { 555 WindowTreeHostImpl* WindowTreeImpl::GetHostForWindowManager() {
515 // The WindowTreeImpl for the wm has one and only one root. 556 // The WindowTreeImpl for the wm has one and only one root.
516 CHECK_EQ(1u, roots_.size()); 557 CHECK_EQ(1u, roots_.size());
517 558
518 // Indicates this connection is for the wm. 559 // Indicates this connection is for the wm.
519 DCHECK(window_manager_internal_); 560 DCHECK(window_manager_internal_);
520 561
521 WindowTreeHostImpl* host = GetHost(*roots_.begin()); 562 WindowTreeHostImpl* host = GetHost(*roots_.begin());
(...skipping 20 matching lines...) Expand all
542 if (!host || !host->GetWindowTree() || 583 if (!host || !host->GetWindowTree() ||
543 !host->GetWindowTree()->window_manager_internal_) { 584 !host->GetWindowTree()->window_manager_internal_) {
544 return false; 585 return false;
545 } 586 }
546 587
547 // Requests coming from the WM should not be routed through the WM again. 588 // Requests coming from the WM should not be routed through the WM again.
548 const bool is_wm = host->GetWindowTree() == this; 589 const bool is_wm = host->GetWindowTree() == this;
549 return is_wm ? false : true; 590 return is_wm ? false : true;
550 } 591 }
551 592
552 bool WindowTreeImpl::IsWindowKnown(const ServerWindow* window) const { 593 ClientWindowId WindowTreeImpl::ClientWindowIdForWindow(
553 return known_windows_.count(WindowIdToTransportId(window->id())) > 0; 594 const ServerWindow* window) const {
595 auto iter = window_id_to_client_id_map_.find(window->id());
596 DCHECK(iter != window_id_to_client_id_map_.end());
597 return iter->second;
554 } 598 }
555 599
556 bool WindowTreeImpl::IsValidIdForNewWindow(const WindowId& id) const { 600 bool WindowTreeImpl::IsValidIdForNewWindow(const ClientWindowId& id) const {
557 return id.connection_id == id_ && embed_to_real_id_map_.count(id) == 0 && 601 if (is_embed_root_ && WindowIdFromTransportId(id.id).connection_id != id_) {
558 window_map_.count(id.window_id) == 0; 602 // Embed roots see windows created from other connections. If they don't
603 // use the connection id when creating windows the client could end up with
604 // two windows with the same id. Because of this we restrict the ids such
605 // connections can create.
606 return false;
607 }
608 return client_id_to_window_id_map_.count(id) == 0u;
609 }
610
611 WindowId WindowTreeImpl::GenerateNewWindowId() {
612 // TODO(sky): deal with wrapping and uniqueness.
613 return WindowId(id_, next_window_id_++);
559 } 614 }
560 615
561 bool WindowTreeImpl::CanReorderWindow(const ServerWindow* window, 616 bool WindowTreeImpl::CanReorderWindow(const ServerWindow* window,
562 const ServerWindow* relative_window, 617 const ServerWindow* relative_window,
563 mojom::OrderDirection direction) const { 618 mojom::OrderDirection direction) const {
564 if (!window || !relative_window) 619 if (!window || !relative_window)
565 return false; 620 return false;
566 621
567 if (!window->parent() || window->parent() != relative_window->parent()) 622 if (!window->parent() || window->parent() != relative_window->parent())
568 return false; 623 return false;
(...skipping 23 matching lines...) Expand all
592 delete window; 647 delete window;
593 return true; 648 return true;
594 } 649 }
595 650
596 void WindowTreeImpl::GetUnknownWindowsFrom( 651 void WindowTreeImpl::GetUnknownWindowsFrom(
597 const ServerWindow* window, 652 const ServerWindow* window,
598 std::vector<const ServerWindow*>* windows) { 653 std::vector<const ServerWindow*>* windows) {
599 if (IsWindowKnown(window) || !access_policy_->CanGetWindowTree(window)) 654 if (IsWindowKnown(window) || !access_policy_->CanGetWindowTree(window))
600 return; 655 return;
601 windows->push_back(window); 656 windows->push_back(window);
602 known_windows_.insert(WindowIdToTransportId(window->id())); 657 // There are two cases where this gets hit:
658 // . During init, in which case using the window id as the client id is
659 // fine.
660 // . When a window is moved to a parent of a window we know about. This is
661 // only encountered for the WM or embed roots. We assume such clients want
662 // to see the real id of the window and are only created ClientWindowIds
663 // with the connection_id.
664 const ClientWindowId client_window_id(WindowIdToTransportId(window->id()));
665 DCHECK_EQ(0u, client_id_to_window_id_map_.count(client_window_id));
666 client_id_to_window_id_map_[client_window_id] = window->id();
667 window_id_to_client_id_map_[window->id()] = client_window_id;
603 if (!access_policy_->CanDescendIntoWindowForWindowTree(window)) 668 if (!access_policy_->CanDescendIntoWindowForWindowTree(window))
604 return; 669 return;
605 std::vector<const ServerWindow*> children(window->GetChildren()); 670 std::vector<const ServerWindow*> children(window->GetChildren());
606 for (size_t i = 0; i < children.size(); ++i) 671 for (size_t i = 0; i < children.size(); ++i)
607 GetUnknownWindowsFrom(children[i], windows); 672 GetUnknownWindowsFrom(children[i], windows);
608 } 673 }
609 674
675 bool WindowTreeImpl::RemoveFromMaps(const ServerWindow* window) {
676 auto iter = window_id_to_client_id_map_.find(window->id());
677 if (iter == window_id_to_client_id_map_.end())
678 return false;
679
680 client_id_to_window_id_map_.erase(iter->second);
681 window_id_to_client_id_map_.erase(iter);
682 return true;
683 }
684
610 void WindowTreeImpl::RemoveFromKnown( 685 void WindowTreeImpl::RemoveFromKnown(
611 const ServerWindow* window, 686 const ServerWindow* window,
612 std::vector<ServerWindow*>* local_windows) { 687 std::vector<ServerWindow*>* local_windows) {
613 if (window->id().connection_id == id_) { 688 if (window->id().connection_id == id_) {
614 if (local_windows) 689 if (local_windows)
615 local_windows->push_back(GetWindow(window->id())); 690 local_windows->push_back(GetWindow(window->id()));
616 return; 691 return;
617 } 692 }
618 known_windows_.erase(WindowIdToTransportId(window->id())); 693
694 RemoveFromMaps(window);
695
619 std::vector<const ServerWindow*> children = window->GetChildren(); 696 std::vector<const ServerWindow*> children = window->GetChildren();
620 for (size_t i = 0; i < children.size(); ++i) 697 for (size_t i = 0; i < children.size(); ++i)
621 RemoveFromKnown(children[i], local_windows); 698 RemoveFromKnown(children[i], local_windows);
622 } 699 }
623 700
624 void WindowTreeImpl::RemoveRoot(const ServerWindow* window, 701 void WindowTreeImpl::RemoveRoot(const ServerWindow* window,
625 RemoveRootReason reason) { 702 RemoveRootReason reason) {
626 DCHECK(roots_.count(window) > 0); 703 DCHECK(roots_.count(window) > 0);
627 roots_.erase(window); 704 roots_.erase(window);
628 const Id transport_id = MapWindowIdToClient(window);
629 705
630 for (auto& pair : embed_to_real_id_map_) { 706 const ClientWindowId client_window_id(ClientWindowIdForWindow(window));
631 if (pair.second == window->id()) {
632 embed_to_real_id_map_.erase(pair.first);
633 break;
634 }
635 }
636 707
637 // No need to do anything if we created the window. 708 // No need to do anything if we created the window.
638 if (window->id().connection_id == id_) 709 if (window->id().connection_id == id_)
639 return; 710 return;
640 711
641 if (reason == RemoveRootReason::EMBED) { 712 if (reason == RemoveRootReason::EMBED) {
642 client_->OnUnembed(transport_id); 713 client_->OnUnembed(client_window_id.id);
643 client_->OnWindowDeleted(transport_id); 714 client_->OnWindowDeleted(client_window_id.id);
644 connection_manager_->OnConnectionMessagedClient(id_); 715 connection_manager_->OnConnectionMessagedClient(id_);
645 } 716 }
646 717
647 // This connection no longer knows about the window. Unparent any windows that 718 // This connection no longer knows about the window. Unparent any windows that
648 // were parented to windows in the root. 719 // were parented to windows in the root.
649 std::vector<ServerWindow*> local_windows; 720 std::vector<ServerWindow*> local_windows;
650 RemoveFromKnown(window, &local_windows); 721 RemoveFromKnown(window, &local_windows);
651 for (size_t i = 0; i < local_windows.size(); ++i) 722 for (size_t i = 0; i < local_windows.size(); ++i)
652 local_windows[i]->parent()->Remove(local_windows[i]); 723 local_windows[i]->parent()->Remove(local_windows[i]);
653 } 724 }
654 725
655 Array<mojom::WindowDataPtr> WindowTreeImpl::WindowsToWindowDatas( 726 Array<mojom::WindowDataPtr> WindowTreeImpl::WindowsToWindowDatas(
656 const std::vector<const ServerWindow*>& windows) { 727 const std::vector<const ServerWindow*>& windows) {
657 Array<mojom::WindowDataPtr> array(windows.size()); 728 Array<mojom::WindowDataPtr> array(windows.size());
658 for (size_t i = 0; i < windows.size(); ++i) 729 for (size_t i = 0; i < windows.size(); ++i)
659 array[i] = WindowToWindowData(windows[i]); 730 array[i] = WindowToWindowData(windows[i]);
660 return array; 731 return array;
661 } 732 }
662 733
663 mojom::WindowDataPtr WindowTreeImpl::WindowToWindowData( 734 mojom::WindowDataPtr WindowTreeImpl::WindowToWindowData(
664 const ServerWindow* window) { 735 const ServerWindow* window) {
665 DCHECK(IsWindowKnown(window)); 736 DCHECK(IsWindowKnown(window));
666 const ServerWindow* parent = window->parent(); 737 const ServerWindow* parent = window->parent();
667 // If the parent isn't known, it means the parent is not visible to us (not 738 // If the parent isn't known, it means the parent is not visible to us (not
668 // in roots), and should not be sent over. 739 // in roots), and should not be sent over.
669 if (parent && !IsWindowKnown(parent)) 740 if (parent && !IsWindowKnown(parent))
670 parent = NULL; 741 parent = nullptr;
671 mojom::WindowDataPtr window_data(mojom::WindowData::New()); 742 mojom::WindowDataPtr window_data(mojom::WindowData::New());
672 window_data->parent_id = MapWindowIdToClient(parent); 743 window_data->parent_id =
673 window_data->window_id = MapWindowIdToClient(window); 744 parent ? ClientWindowIdForWindow(parent).id : ClientWindowId().id;
745 window_data->window_id =
746 window ? ClientWindowIdForWindow(window).id : ClientWindowId().id;
674 window_data->bounds = Rect::From(window->bounds()); 747 window_data->bounds = Rect::From(window->bounds());
675 window_data->properties = 748 window_data->properties =
676 mojo::Map<String, Array<uint8_t>>::From(window->properties()); 749 mojo::Map<String, Array<uint8_t>>::From(window->properties());
677 window_data->visible = window->visible(); 750 window_data->visible = window->visible();
678 window_data->drawn = window->IsDrawn(); 751 window_data->drawn = window->IsDrawn();
679 window_data->viewport_metrics = 752 window_data->viewport_metrics =
680 connection_manager_->GetViewportMetricsForWindow(window); 753 connection_manager_->GetViewportMetricsForWindow(window);
681 return window_data; 754 return window_data;
682 } 755 }
683 756
(...skipping 17 matching lines...) Expand all
701 774
702 void WindowTreeImpl::NotifyDrawnStateChanged(const ServerWindow* window, 775 void WindowTreeImpl::NotifyDrawnStateChanged(const ServerWindow* window,
703 bool new_drawn_value) { 776 bool new_drawn_value) {
704 // Even though we don't know about window, it may be an ancestor of our root, 777 // Even though we don't know about window, it may be an ancestor of our root,
705 // in which case the change may effect our roots drawn state. 778 // in which case the change may effect our roots drawn state.
706 if (roots_.empty()) 779 if (roots_.empty())
707 return; 780 return;
708 781
709 for (auto* root : roots_) { 782 for (auto* root : roots_) {
710 if (window->Contains(root) && (new_drawn_value != root->IsDrawn())) { 783 if (window->Contains(root) && (new_drawn_value != root->IsDrawn())) {
711 client_->OnWindowDrawnStateChanged(MapWindowIdToClient(root), 784 client_->OnWindowDrawnStateChanged(ClientWindowIdForWindow(root).id,
712 new_drawn_value); 785 new_drawn_value);
713 } 786 }
714 } 787 }
715 } 788 }
716 789
717 void WindowTreeImpl::DestroyWindows() { 790 void WindowTreeImpl::DestroyWindows() {
718 if (window_map_.empty()) 791 if (created_window_map_.empty())
719 return; 792 return;
720 793
721 Operation op(this, connection_manager_, OperationType::DELETE_WINDOW); 794 Operation op(this, connection_manager_, OperationType::DELETE_WINDOW);
722 // If we get here from the destructor we're not going to get 795 // If we get here from the destructor we're not going to get
723 // ProcessWindowDeleted(). Copy the map and delete from the copy so that we 796 // ProcessWindowDeleted(). Copy the map and delete from the copy so that we
724 // don't have to worry about whether |window_map_| changes or not. 797 // don't have to worry about whether |created_window_map_| changes or not.
725 WindowMap window_map_copy; 798 base::hash_map<WindowId, ServerWindow*> created_window_map_copy;
726 window_map_.swap(window_map_copy); 799 created_window_map_.swap(created_window_map_copy);
727 // A sibling can be a transient parent of another window so we detach windows 800 // A sibling can be a transient parent of another window so we detach windows
728 // from their transient parents to avoid double deletes. 801 // from their transient parents to avoid double deletes.
729 for (auto& pair : window_map_copy) { 802 for (auto& pair : created_window_map_copy) {
730 ServerWindow* transient_parent = pair.second->transient_parent(); 803 ServerWindow* transient_parent = pair.second->transient_parent();
731 if (transient_parent) 804 if (transient_parent)
732 transient_parent->RemoveTransientWindow(pair.second); 805 transient_parent->RemoveTransientWindow(pair.second);
733 } 806 }
734 STLDeleteValues(&window_map_copy); 807 STLDeleteValues(&created_window_map_copy);
735 } 808 }
736 809
737 bool WindowTreeImpl::CanEmbed(const WindowId& window_id, 810 bool WindowTreeImpl::CanEmbed(const ClientWindowId& window_id,
738 uint32_t policy_bitmask) const { 811 uint32_t policy_bitmask) const {
739 const ServerWindow* window = GetWindow(window_id); 812 const ServerWindow* window = GetWindowByClientId(window_id);
740 return window && access_policy_->CanEmbed(window, policy_bitmask); 813 return window && access_policy_->CanEmbed(window, policy_bitmask);
741 } 814 }
742 815
743 void WindowTreeImpl::PrepareForEmbed(const WindowId& window_id) { 816 void WindowTreeImpl::PrepareForEmbed(ServerWindow* window) {
744 const ServerWindow* window = GetWindow(window_id);
745 DCHECK(window); 817 DCHECK(window);
746 818
747 // Only allow a node to be the root for one connection. 819 // Only allow a node to be the root for one connection.
748 WindowTreeImpl* existing_owner = 820 WindowTreeImpl* existing_owner =
749 connection_manager_->GetConnectionWithRoot(window); 821 connection_manager_->GetConnectionWithRoot(window);
750 822
751 Operation op(this, connection_manager_, OperationType::EMBED); 823 Operation op(this, connection_manager_, OperationType::EMBED);
752 RemoveChildrenAsPartOfEmbed(window_id); 824 RemoveChildrenAsPartOfEmbed(window);
753 if (existing_owner) { 825 if (existing_owner) {
754 // Never message the originating connection. 826 // Never message the originating connection.
755 connection_manager_->OnConnectionMessagedClient(id_); 827 connection_manager_->OnConnectionMessagedClient(id_);
756 existing_owner->RemoveRoot(window, RemoveRootReason::EMBED); 828 existing_owner->RemoveRoot(window, RemoveRootReason::EMBED);
757 } 829 }
758 } 830 }
759 831
760 void WindowTreeImpl::RemoveChildrenAsPartOfEmbed(const WindowId& window_id) { 832 void WindowTreeImpl::RemoveChildrenAsPartOfEmbed(ServerWindow* window) {
761 ServerWindow* window = GetWindow(window_id);
762 CHECK(window); 833 CHECK(window);
763 CHECK(window->id().connection_id == window_id.connection_id);
764 std::vector<ServerWindow*> children = window->GetChildren(); 834 std::vector<ServerWindow*> children = window->GetChildren();
765 for (size_t i = 0; i < children.size(); ++i) 835 for (size_t i = 0; i < children.size(); ++i)
766 window->Remove(children[i]); 836 window->Remove(children[i]);
767 } 837 }
768 838
769 void WindowTreeImpl::DispatchInputEventImpl(ServerWindow* target, 839 void WindowTreeImpl::DispatchInputEventImpl(ServerWindow* target,
770 mojom::EventPtr event) { 840 mojom::EventPtr event) {
771 DCHECK(!event_ack_id_); 841 DCHECK(!event_ack_id_);
772 // We do not want to create a sequential id for each event, because that can 842 // We do not want to create a sequential id for each event, because that can
773 // leak some information to the client. So instead, manufacture the id from 843 // leak some information to the client. So instead, manufacture the id from
774 // the event pointer. 844 // the event pointer.
775 event_ack_id_ = 845 event_ack_id_ =
776 0x1000000 | (reinterpret_cast<uintptr_t>(event.get()) & 0xffffff); 846 0x1000000 | (reinterpret_cast<uintptr_t>(event.get()) & 0xffffff);
777 event_source_host_ = GetHost(target); 847 event_source_host_ = GetHost(target);
778 // Should only get events from windows attached to a host. 848 // Should only get events from windows attached to a host.
779 DCHECK(event_source_host_); 849 DCHECK(event_source_host_);
780 client_->OnWindowInputEvent(event_ack_id_, MapWindowIdToClient(target), 850 client_->OnWindowInputEvent(event_ack_id_, ClientWindowIdForWindow(target).id,
781 std::move(event)); 851 std::move(event));
782 } 852 }
783 853
784 void WindowTreeImpl::NewWindow( 854 void WindowTreeImpl::NewWindow(
785 uint32_t change_id, 855 uint32_t change_id,
786 Id transport_window_id, 856 Id transport_window_id,
787 mojo::Map<mojo::String, mojo::Array<uint8_t>> transport_properties) { 857 mojo::Map<mojo::String, mojo::Array<uint8_t>> transport_properties) {
788 std::map<std::string, std::vector<uint8_t>> properties; 858 std::map<std::string, std::vector<uint8_t>> properties;
789 if (!transport_properties.is_null()) { 859 if (!transport_properties.is_null()) {
790 properties = 860 properties =
791 transport_properties.To<std::map<std::string, std::vector<uint8_t>>>(); 861 transport_properties.To<std::map<std::string, std::vector<uint8_t>>>();
792 } 862 }
793 client_->OnChangeCompleted( 863 client_->OnChangeCompleted(
794 change_id, 864 change_id, NewWindow(ClientWindowId(transport_window_id), properties));
795 NewWindow(MapWindowIdFromClient(transport_window_id), properties));
796 } 865 }
797 866
798 void WindowTreeImpl::NewTopLevelWindow( 867 void WindowTreeImpl::NewTopLevelWindow(
799 uint32_t change_id, 868 uint32_t change_id,
800 Id transport_window_id, 869 Id transport_window_id,
801 mojo::Map<mojo::String, mojo::Array<uint8_t>> transport_properties) { 870 mojo::Map<mojo::String, mojo::Array<uint8_t>> transport_properties) {
802 DCHECK(!waiting_for_top_level_window_info_); 871 DCHECK(!waiting_for_top_level_window_info_);
803 const WindowId window_id(MapWindowIdFromClient(transport_window_id)); 872 const ClientWindowId client_window_id(transport_window_id);
804 // TODO(sky): need a way for client to provide context. 873 // TODO(sky): need a way for client to provide context.
805 WindowTreeHostImpl* tree_host = 874 WindowTreeHostImpl* tree_host =
806 connection_manager_->GetActiveWindowTreeHost(); 875 connection_manager_->GetActiveWindowTreeHost();
807 if (!tree_host || tree_host->GetWindowTree() == this || 876 if (!tree_host || tree_host->GetWindowTree() == this ||
808 !IsValidIdForNewWindow(window_id)) { 877 !IsValidIdForNewWindow(client_window_id)) {
809 client_->OnChangeCompleted(change_id, false); 878 client_->OnChangeCompleted(change_id, false);
810 return; 879 return;
811 } 880 }
812 881
813 // The server creates the real window. Any further messages from the client 882 // The server creates the real window. Any further messages from the client
814 // may try to alter the window. Pause incoming messages so that we know we 883 // may try to alter the window. Pause incoming messages so that we know we
815 // can't get a message for a window before the window is created. Once the 884 // can't get a message for a window before the window is created. Once the
816 // window is created we'll resume processing. 885 // window is created we'll resume processing.
817 connection_manager_->GetClientConnection(this) 886 connection_manager_->GetClientConnection(this)
818 ->SetIncomingMethodCallProcessingPaused(true); 887 ->SetIncomingMethodCallProcessingPaused(true);
819 888
820 const uint32_t wm_change_id = 889 const uint32_t wm_change_id =
821 connection_manager_->GenerateWindowManagerChangeId(this, change_id); 890 connection_manager_->GenerateWindowManagerChangeId(this, change_id);
822 891
823 waiting_for_top_level_window_info_.reset( 892 waiting_for_top_level_window_info_.reset(
824 new WaitingForTopLevelWindowInfo(window_id, wm_change_id)); 893 new WaitingForTopLevelWindowInfo(client_window_id, wm_change_id));
825 894
826 tree_host->GetWindowTree()->window_manager_internal_->WmCreateTopLevelWindow( 895 tree_host->GetWindowTree()->window_manager_internal_->WmCreateTopLevelWindow(
827 wm_change_id, std::move(transport_properties)); 896 wm_change_id, std::move(transport_properties));
828 } 897 }
829 898
830 void WindowTreeImpl::DeleteWindow(uint32_t change_id, Id transport_window_id) { 899 void WindowTreeImpl::DeleteWindow(uint32_t change_id, Id transport_window_id) {
831 ServerWindow* window = GetWindow(MapWindowIdFromClient(transport_window_id)); 900 ServerWindow* window =
901 GetWindowByClientId(ClientWindowId(transport_window_id));
832 bool success = false; 902 bool success = false;
833 bool should_close = window && (access_policy_->CanDeleteWindow(window) || 903 bool should_close = window && (access_policy_->CanDeleteWindow(window) ||
834 ShouldRouteToWindowManager(window)); 904 ShouldRouteToWindowManager(window));
835 if (should_close) { 905 if (should_close) {
836 WindowTreeImpl* connection = 906 WindowTreeImpl* connection =
837 connection_manager_->GetConnection(window->id().connection_id); 907 connection_manager_->GetConnection(window->id().connection_id);
838 success = connection && connection->DeleteWindowImpl(this, window); 908 success = connection && connection->DeleteWindowImpl(this, window);
839 } 909 }
840 client_->OnChangeCompleted(change_id, success); 910 client_->OnChangeCompleted(change_id, success);
841 } 911 }
842 912
843 void WindowTreeImpl::AddWindow(uint32_t change_id, Id parent_id, Id child_id) { 913 void WindowTreeImpl::AddWindow(uint32_t change_id, Id parent_id, Id child_id) {
844 client_->OnChangeCompleted(change_id, 914 client_->OnChangeCompleted(change_id, AddWindow(ClientWindowId(parent_id),
845 AddWindow(MapWindowIdFromClient(parent_id), 915 ClientWindowId(child_id)));
846 MapWindowIdFromClient(child_id)));
847 } 916 }
848 917
849 void WindowTreeImpl::RemoveWindowFromParent(uint32_t change_id, Id window_id) { 918 void WindowTreeImpl::RemoveWindowFromParent(uint32_t change_id, Id window_id) {
850 bool success = false; 919 bool success = false;
851 ServerWindow* window = GetWindow(MapWindowIdFromClient(window_id)); 920 ServerWindow* window = GetWindowByClientId(ClientWindowId(window_id));
852 if (window && window->parent() && 921 if (window && window->parent() &&
853 access_policy_->CanRemoveWindowFromParent(window)) { 922 access_policy_->CanRemoveWindowFromParent(window)) {
854 success = true; 923 success = true;
855 Operation op(this, connection_manager_, 924 Operation op(this, connection_manager_,
856 OperationType::REMOVE_WINDOW_FROM_PARENT); 925 OperationType::REMOVE_WINDOW_FROM_PARENT);
857 window->parent()->Remove(window); 926 window->parent()->Remove(window);
858 } 927 }
859 client_->OnChangeCompleted(change_id, success); 928 client_->OnChangeCompleted(change_id, success);
860 } 929 }
861 930
862 void WindowTreeImpl::AddTransientWindow(uint32_t change_id, 931 void WindowTreeImpl::AddTransientWindow(uint32_t change_id,
863 Id window, 932 Id window,
864 Id transient_window) { 933 Id transient_window) {
865 client_->OnChangeCompleted( 934 client_->OnChangeCompleted(
866 change_id, AddTransientWindow(MapWindowIdFromClient(window), 935 change_id, AddTransientWindow(ClientWindowId(window),
867 MapWindowIdFromClient(transient_window))); 936 ClientWindowId(transient_window)));
868 } 937 }
869 938
870 void WindowTreeImpl::RemoveTransientWindowFromParent(uint32_t change_id, 939 void WindowTreeImpl::RemoveTransientWindowFromParent(uint32_t change_id,
871 Id transient_window_id) { 940 Id transient_window_id) {
872 bool success = false; 941 bool success = false;
873 ServerWindow* transient_window = 942 ServerWindow* transient_window =
874 GetWindow(MapWindowIdFromClient(transient_window_id)); 943 GetWindowByClientId(ClientWindowId(transient_window_id));
875 if (transient_window->transient_parent() && 944 if (transient_window && transient_window->transient_parent() &&
876 access_policy_->CanRemoveTransientWindowFromParent(transient_window)) { 945 access_policy_->CanRemoveTransientWindowFromParent(transient_window)) {
877 success = true; 946 success = true;
878 Operation op(this, connection_manager_, 947 Operation op(this, connection_manager_,
879 OperationType::REMOVE_TRANSIENT_WINDOW_FROM_PARENT); 948 OperationType::REMOVE_TRANSIENT_WINDOW_FROM_PARENT);
880 transient_window->transient_parent()->RemoveTransientWindow( 949 transient_window->transient_parent()->RemoveTransientWindow(
881 transient_window); 950 transient_window);
882 } 951 }
883 client_->OnChangeCompleted(change_id, success); 952 client_->OnChangeCompleted(change_id, success);
884 } 953 }
885 954
886 void WindowTreeImpl::ReorderWindow(uint32_t change_id, 955 void WindowTreeImpl::ReorderWindow(uint32_t change_id,
887 Id window_id, 956 Id window_id,
888 Id relative_window_id, 957 Id relative_window_id,
889 mojom::OrderDirection direction) { 958 mojom::OrderDirection direction) {
890 bool success = false; 959 bool success = false;
891 ServerWindow* window = GetWindow(MapWindowIdFromClient(window_id)); 960 ServerWindow* window = GetWindowByClientId(ClientWindowId(window_id));
892 ServerWindow* relative_window = 961 ServerWindow* relative_window =
893 GetWindow(MapWindowIdFromClient(relative_window_id)); 962 GetWindowByClientId(ClientWindowId(relative_window_id));
894 if (CanReorderWindow(window, relative_window, direction)) { 963 if (CanReorderWindow(window, relative_window, direction)) {
895 success = true; 964 success = true;
896 Operation op(this, connection_manager_, OperationType::REORDER_WINDOW); 965 Operation op(this, connection_manager_, OperationType::REORDER_WINDOW);
897 window->Reorder(relative_window, direction); 966 window->Reorder(relative_window, direction);
898 connection_manager_->ProcessWindowReorder(window, relative_window, 967 connection_manager_->ProcessWindowReorder(window, relative_window,
899 direction); 968 direction);
900 } 969 }
901 client_->OnChangeCompleted(change_id, success); 970 client_->OnChangeCompleted(change_id, success);
902 } 971 }
903 972
904 void WindowTreeImpl::GetWindowTree( 973 void WindowTreeImpl::GetWindowTree(
905 Id window_id, 974 Id window_id,
906 const Callback<void(Array<mojom::WindowDataPtr>)>& callback) { 975 const Callback<void(Array<mojom::WindowDataPtr>)>& callback) {
907 std::vector<const ServerWindow*> windows( 976 std::vector<const ServerWindow*> windows(
908 GetWindowTree(MapWindowIdFromClient(window_id))); 977 GetWindowTree(ClientWindowId(window_id)));
909 callback.Run(WindowsToWindowDatas(windows)); 978 callback.Run(WindowsToWindowDatas(windows));
910 } 979 }
911 980
912 void WindowTreeImpl::SetWindowBounds(uint32_t change_id, 981 void WindowTreeImpl::SetWindowBounds(uint32_t change_id,
913 Id window_id, 982 Id window_id,
914 mojo::RectPtr bounds) { 983 mojo::RectPtr bounds) {
915 ServerWindow* window = GetWindow(MapWindowIdFromClient(window_id)); 984 ServerWindow* window = GetWindowByClientId(ClientWindowId(window_id));
916 if (window && ShouldRouteToWindowManager(window)) { 985 if (window && ShouldRouteToWindowManager(window)) {
917 const uint32_t wm_change_id = 986 const uint32_t wm_change_id =
918 connection_manager_->GenerateWindowManagerChangeId(this, change_id); 987 connection_manager_->GenerateWindowManagerChangeId(this, change_id);
919 // |window_id| may be a client id, use the id from the window to ensure 988 // |window_id| may be a client id, use the id from the window to ensure
920 // the windowmanager doesn't get an id it doesn't know about. 989 // the windowmanager doesn't get an id it doesn't know about.
921 GetHost(window)->GetWindowTree()->window_manager_internal_->WmSetBounds( 990 WindowTreeImpl* wm_window_tree = GetHost(window)->GetWindowTree();
922 wm_change_id, WindowIdToTransportId(window->id()), std::move(bounds)); 991 wm_window_tree->window_manager_internal_->WmSetBounds(
992 wm_change_id, wm_window_tree->ClientWindowIdForWindow(window).id,
993 std::move(bounds));
923 return; 994 return;
924 } 995 }
925 996
926 // Only the owner of the window can change the bounds. 997 // Only the owner of the window can change the bounds.
927 bool success = window && access_policy_->CanSetWindowBounds(window); 998 bool success = window && access_policy_->CanSetWindowBounds(window);
928 if (success) { 999 if (success) {
929 Operation op(this, connection_manager_, OperationType::SET_WINDOW_BOUNDS); 1000 Operation op(this, connection_manager_, OperationType::SET_WINDOW_BOUNDS);
930 window->SetBounds(bounds.To<gfx::Rect>()); 1001 window->SetBounds(bounds.To<gfx::Rect>());
931 } 1002 }
932 client_->OnChangeCompleted(change_id, success); 1003 client_->OnChangeCompleted(change_id, success);
933 } 1004 }
934 1005
935 void WindowTreeImpl::SetWindowVisibility(uint32_t change_id, 1006 void WindowTreeImpl::SetWindowVisibility(uint32_t change_id,
936 Id transport_window_id, 1007 Id transport_window_id,
937 bool visible) { 1008 bool visible) {
938 client_->OnChangeCompleted( 1009 client_->OnChangeCompleted(
939 change_id, 1010 change_id,
940 SetWindowVisibility(MapWindowIdFromClient(transport_window_id), visible)); 1011 SetWindowVisibility(ClientWindowId(transport_window_id), visible));
941 } 1012 }
942 1013
943 void WindowTreeImpl::SetWindowProperty(uint32_t change_id, 1014 void WindowTreeImpl::SetWindowProperty(uint32_t change_id,
944 Id transport_window_id, 1015 Id transport_window_id,
945 const mojo::String& name, 1016 const mojo::String& name,
946 mojo::Array<uint8_t> value) { 1017 mojo::Array<uint8_t> value) {
947 ServerWindow* window = GetWindow(MapWindowIdFromClient(transport_window_id)); 1018 ServerWindow* window =
1019 GetWindowByClientId(ClientWindowId(transport_window_id));
948 if (window && ShouldRouteToWindowManager(window)) { 1020 if (window && ShouldRouteToWindowManager(window)) {
949 const uint32_t wm_change_id = 1021 const uint32_t wm_change_id =
950 connection_manager_->GenerateWindowManagerChangeId(this, change_id); 1022 connection_manager_->GenerateWindowManagerChangeId(this, change_id);
951 GetHost(window)->GetWindowTree()->window_manager_internal_->WmSetProperty( 1023 WindowTreeImpl* wm_window_tree = GetHost(window)->GetWindowTree();
952 wm_change_id, WindowIdToTransportId(window->id()), name, 1024 wm_window_tree->window_manager_internal_->WmSetProperty(
1025 wm_change_id, wm_window_tree->ClientWindowIdForWindow(window).id, name,
953 std::move(value)); 1026 std::move(value));
954 return; 1027 return;
955 } 1028 }
956 const bool success = window && access_policy_->CanSetWindowProperties(window); 1029 const bool success = window && access_policy_->CanSetWindowProperties(window);
957 if (success) { 1030 if (success) {
958 Operation op(this, connection_manager_, OperationType::SET_WINDOW_PROPERTY); 1031 Operation op(this, connection_manager_, OperationType::SET_WINDOW_PROPERTY);
959 if (value.is_null()) { 1032 if (value.is_null()) {
960 window->SetProperty(name, nullptr); 1033 window->SetProperty(name, nullptr);
961 } else { 1034 } else {
962 std::vector<uint8_t> data = value.To<std::vector<uint8_t>>(); 1035 std::vector<uint8_t> data = value.To<std::vector<uint8_t>>();
963 window->SetProperty(name, &data); 1036 window->SetProperty(name, &data);
964 } 1037 }
965 } 1038 }
966 client_->OnChangeCompleted(change_id, success); 1039 client_->OnChangeCompleted(change_id, success);
967 } 1040 }
968 1041
969 void WindowTreeImpl::AttachSurface( 1042 void WindowTreeImpl::AttachSurface(
970 Id transport_window_id, 1043 Id transport_window_id,
971 mojom::SurfaceType type, 1044 mojom::SurfaceType type,
972 mojo::InterfaceRequest<mojom::Surface> surface, 1045 mojo::InterfaceRequest<mojom::Surface> surface,
973 mojom::SurfaceClientPtr client) { 1046 mojom::SurfaceClientPtr client) {
974 ServerWindow* window = GetWindow(MapWindowIdFromClient(transport_window_id)); 1047 ServerWindow* window =
1048 GetWindowByClientId(ClientWindowId(transport_window_id));
975 const bool success = 1049 const bool success =
976 window && access_policy_->CanSetWindowSurface(window, type); 1050 window && access_policy_->CanSetWindowSurface(window, type);
977 if (!success) 1051 if (!success)
978 return; 1052 return;
979 window->CreateSurface(type, std::move(surface), std::move(client)); 1053 window->CreateSurface(type, std::move(surface), std::move(client));
980 } 1054 }
981 1055
982 void WindowTreeImpl::SetWindowTextInputState(Id transport_window_id, 1056 void WindowTreeImpl::SetWindowTextInputState(Id transport_window_id,
983 mojo::TextInputStatePtr state) { 1057 mojo::TextInputStatePtr state) {
984 ServerWindow* window = GetWindow(MapWindowIdFromClient(transport_window_id)); 1058 ServerWindow* window =
1059 GetWindowByClientId(ClientWindowId(transport_window_id));
985 bool success = window && access_policy_->CanSetWindowTextInputState(window); 1060 bool success = window && access_policy_->CanSetWindowTextInputState(window);
986 if (success) 1061 if (success)
987 window->SetTextInputState(state.To<ui::TextInputState>()); 1062 window->SetTextInputState(state.To<ui::TextInputState>());
988 } 1063 }
989 1064
990 void WindowTreeImpl::SetImeVisibility(Id transport_window_id, 1065 void WindowTreeImpl::SetImeVisibility(Id transport_window_id,
991 bool visible, 1066 bool visible,
992 mojo::TextInputStatePtr state) { 1067 mojo::TextInputStatePtr state) {
993 ServerWindow* window = GetWindow(MapWindowIdFromClient(transport_window_id)); 1068 ServerWindow* window =
1069 GetWindowByClientId(ClientWindowId(transport_window_id));
994 bool success = window && access_policy_->CanSetWindowTextInputState(window); 1070 bool success = window && access_policy_->CanSetWindowTextInputState(window);
995 if (success) { 1071 if (success) {
996 if (!state.is_null()) 1072 if (!state.is_null())
997 window->SetTextInputState(state.To<ui::TextInputState>()); 1073 window->SetTextInputState(state.To<ui::TextInputState>());
998 1074
999 WindowTreeHostImpl* host = GetHost(window); 1075 WindowTreeHostImpl* host = GetHost(window);
1000 if (host) 1076 if (host)
1001 host->SetImeVisibility(window, visible); 1077 host->SetImeVisibility(window, visible);
1002 } 1078 }
1003 } 1079 }
(...skipping 23 matching lines...) Expand all
1027 } while (!event_queue_.empty() && !GetHost(target)); 1103 } while (!event_queue_.empty() && !GetHost(target));
1028 if (target) 1104 if (target)
1029 DispatchInputEventImpl(target, std::move(event)); 1105 DispatchInputEventImpl(target, std::move(event));
1030 } 1106 }
1031 } 1107 }
1032 1108
1033 void WindowTreeImpl::SetClientArea( 1109 void WindowTreeImpl::SetClientArea(
1034 Id transport_window_id, 1110 Id transport_window_id,
1035 mojo::InsetsPtr insets, 1111 mojo::InsetsPtr insets,
1036 mojo::Array<mojo::RectPtr> transport_additional_client_areas) { 1112 mojo::Array<mojo::RectPtr> transport_additional_client_areas) {
1037 ServerWindow* window = GetWindow(MapWindowIdFromClient(transport_window_id)); 1113 ServerWindow* window =
1114 GetWindowByClientId(ClientWindowId(transport_window_id));
1038 if (!window || !access_policy_->CanSetClientArea(window)) 1115 if (!window || !access_policy_->CanSetClientArea(window))
1039 return; 1116 return;
1040 1117
1041 std::vector<gfx::Rect> additional_client_areas = 1118 std::vector<gfx::Rect> additional_client_areas =
1042 transport_additional_client_areas.To<std::vector<gfx::Rect>>(); 1119 transport_additional_client_areas.To<std::vector<gfx::Rect>>();
1043 window->SetClientArea(insets.To<gfx::Insets>(), additional_client_areas); 1120 window->SetClientArea(insets.To<gfx::Insets>(), additional_client_areas);
1044 } 1121 }
1045 1122
1046 void WindowTreeImpl::Embed(Id transport_window_id, 1123 void WindowTreeImpl::Embed(Id transport_window_id,
1047 mojom::WindowTreeClientPtr client, 1124 mojom::WindowTreeClientPtr client,
1048 uint32_t policy_bitmask, 1125 uint32_t policy_bitmask,
1049 const EmbedCallback& callback) { 1126 const EmbedCallback& callback) {
1050 ConnectionSpecificId connection_id = kInvalidConnectionId; 1127 ConnectionSpecificId connection_id = kInvalidConnectionId;
1051 const bool result = Embed(MapWindowIdFromClient(transport_window_id), 1128 const bool result = Embed(ClientWindowId(transport_window_id),
1052 std::move(client), policy_bitmask, &connection_id); 1129 std::move(client), policy_bitmask, &connection_id);
1053 callback.Run(result, connection_id); 1130 callback.Run(result, connection_id);
1054 } 1131 }
1055 1132
1056 void WindowTreeImpl::SetFocus(uint32_t change_id, Id transport_window_id) { 1133 void WindowTreeImpl::SetFocus(uint32_t change_id, Id transport_window_id) {
1057 ServerWindow* window = GetWindow(MapWindowIdFromClient(transport_window_id)); 1134 ServerWindow* window =
1135 GetWindowByClientId(ClientWindowId(transport_window_id));
1058 // TODO(beng): consider shifting non-policy drawn check logic to VTH's 1136 // TODO(beng): consider shifting non-policy drawn check logic to VTH's
1059 // FocusController. 1137 // FocusController.
1060 // TODO(sky): this doesn't work to clear focus. That is because if window is 1138 // TODO(sky): this doesn't work to clear focus. That is because if window is
1061 // null, then |host| is null and we fail. 1139 // null, then |host| is null and we fail.
1062 WindowTreeHostImpl* host = GetHost(window); 1140 WindowTreeHostImpl* host = GetHost(window);
1063 const bool success = window && window->IsDrawn() && window->can_focus() && 1141 const bool success = window && window->IsDrawn() && window->can_focus() &&
1064 access_policy_->CanSetFocus(window) && host; 1142 access_policy_->CanSetFocus(window) && host;
1065 if (success) { 1143 if (success) {
1066 Operation op(this, connection_manager_, OperationType::SET_FOCUS); 1144 Operation op(this, connection_manager_, OperationType::SET_FOCUS);
1067 host->SetFocusedWindow(window); 1145 host->SetFocusedWindow(window);
1068 } 1146 }
1069 client_->OnChangeCompleted(change_id, success); 1147 client_->OnChangeCompleted(change_id, success);
1070 } 1148 }
1071 1149
1072 void WindowTreeImpl::SetCanFocus(Id transport_window_id, bool can_focus) { 1150 void WindowTreeImpl::SetCanFocus(Id transport_window_id, bool can_focus) {
1073 ServerWindow* window = GetWindow(MapWindowIdFromClient(transport_window_id)); 1151 ServerWindow* window =
1152 GetWindowByClientId(ClientWindowId(transport_window_id));
1074 // TODO(sky): there should be an else case (it shouldn't route to wm and 1153 // TODO(sky): there should be an else case (it shouldn't route to wm and
1075 // policy allows, then set_can_focus). 1154 // policy allows, then set_can_focus).
1076 if (window && ShouldRouteToWindowManager(window)) 1155 if (window && ShouldRouteToWindowManager(window))
1077 window->set_can_focus(can_focus); 1156 window->set_can_focus(can_focus);
1078 } 1157 }
1079 1158
1080 void WindowTreeImpl::SetPredefinedCursor(uint32_t change_id, 1159 void WindowTreeImpl::SetPredefinedCursor(uint32_t change_id,
1081 Id transport_window_id, 1160 Id transport_window_id,
1082 mus::mojom::Cursor cursor_id) { 1161 mus::mojom::Cursor cursor_id) {
1083 ServerWindow* window = GetWindow(MapWindowIdFromClient(transport_window_id)); 1162 ServerWindow* window =
1163 GetWindowByClientId(ClientWindowId(transport_window_id));
1084 1164
1085 // Only the owner of the window can change the bounds. 1165 // Only the owner of the window can change the bounds.
1086 bool success = window && access_policy_->CanSetCursorProperties(window); 1166 bool success = window && access_policy_->CanSetCursorProperties(window);
1087 if (success) { 1167 if (success) {
1088 Operation op(this, connection_manager_, 1168 Operation op(this, connection_manager_,
1089 OperationType::SET_WINDOW_PREDEFINED_CURSOR); 1169 OperationType::SET_WINDOW_PREDEFINED_CURSOR);
1090 window->SetPredefinedCursor(cursor_id); 1170 window->SetPredefinedCursor(cursor_id);
1091 } 1171 }
1092 client_->OnChangeCompleted(change_id, success); 1172 client_->OnChangeCompleted(change_id, success);
1093 } 1173 }
(...skipping 17 matching lines...) Expand all
1111 if (GetHostForWindowManager()) 1191 if (GetHostForWindowManager())
1112 connection_manager_->WindowManagerChangeCompleted(change_id, response); 1192 connection_manager_->WindowManagerChangeCompleted(change_id, response);
1113 } 1193 }
1114 1194
1115 void WindowTreeImpl::WmRequestClose(Id transport_window_id) { 1195 void WindowTreeImpl::WmRequestClose(Id transport_window_id) {
1116 // Only the WindowManager should be using this. 1196 // Only the WindowManager should be using this.
1117 WindowTreeHostImpl* host = GetHostForWindowManager(); 1197 WindowTreeHostImpl* host = GetHostForWindowManager();
1118 if (!host) 1198 if (!host)
1119 return; 1199 return;
1120 1200
1121 ServerWindow* window = GetWindow(MapWindowIdFromClient(transport_window_id)); 1201 ServerWindow* window =
1202 GetWindowByClientId(ClientWindowId(transport_window_id));
1122 WindowTreeImpl* connection = 1203 WindowTreeImpl* connection =
1123 connection_manager_->GetConnectionWithRoot(window); 1204 connection_manager_->GetConnectionWithRoot(window);
1124 if (connection && connection != host->GetWindowTree()) 1205 if (connection && connection != host->GetWindowTree())
1125 connection->client_->RequestClose(connection->MapWindowIdToClient(window)); 1206 connection->client_->RequestClose(
1207 connection->ClientWindowIdForWindow(window).id);
1126 // TODO(sky): think about what else case means. 1208 // TODO(sky): think about what else case means.
1127 } 1209 }
1128 1210
1129 void WindowTreeImpl::WmSetFrameDecorationValues( 1211 void WindowTreeImpl::WmSetFrameDecorationValues(
1130 mojom::FrameDecorationValuesPtr values) { 1212 mojom::FrameDecorationValuesPtr values) {
1131 if (GetHostForWindowManager()) 1213 if (GetHostForWindowManager())
1132 GetHostForWindowManager()->SetFrameDecorationValues(std::move(values)); 1214 GetHostForWindowManager()->SetFrameDecorationValues(std::move(values));
1133 } 1215 }
1134 1216
1135 void WindowTreeImpl::OnWmCreatedTopLevelWindow(uint32_t change_id, 1217 void WindowTreeImpl::OnWmCreatedTopLevelWindow(uint32_t change_id,
1136 Id transport_window_id) { 1218 Id transport_window_id) {
1137 if (GetHostForWindowManager()) { 1219 if (GetHostForWindowManager()) {
1138 connection_manager_->WindowManagerCreatedTopLevelWindow( 1220 ServerWindow* window =
1139 this, change_id, transport_window_id); 1221 GetWindowByClientId(ClientWindowId(transport_window_id));
1222 if (window && window->id().connection_id != id_) {
1223 connection_manager_->WindowManagerSentBogusMessage();
1224 window = nullptr;
1225 }
1226 connection_manager_->WindowManagerCreatedTopLevelWindow(this, change_id,
1227 window);
1140 } 1228 }
1141 // TODO(sky): think about what else case means. 1229 // TODO(sky): think about what else case means.
1142 } 1230 }
1143 1231
1144 bool WindowTreeImpl::HasRootForAccessPolicy(const ServerWindow* window) const { 1232 bool WindowTreeImpl::HasRootForAccessPolicy(const ServerWindow* window) const {
1145 return HasRoot(window); 1233 return HasRoot(window);
1146 } 1234 }
1147 1235
1148 bool WindowTreeImpl::IsWindowKnownForAccessPolicy( 1236 bool WindowTreeImpl::IsWindowKnownForAccessPolicy(
1149 const ServerWindow* window) const { 1237 const ServerWindow* window) const {
(...skipping 13 matching lines...) Expand all
1163 1251
1164 for (const auto* root : roots_) { 1252 for (const auto* root : roots_) {
1165 if (root->Contains(window)) 1253 if (root->Contains(window))
1166 return true; 1254 return true;
1167 } 1255 }
1168 return false; 1256 return false;
1169 } 1257 }
1170 1258
1171 } // namespace ws 1259 } // namespace ws
1172 } // namespace mus 1260 } // namespace mus
OLDNEW
« no previous file with comments | « components/mus/ws/window_tree_impl.h ('k') | components/mus/ws/window_tree_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698