OLD | NEW |
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 #ifndef COMPONENTS_MUS_WS_WINDOW_TREE_IMPL_H_ | 5 #ifndef COMPONENTS_MUS_WS_WINDOW_TREE_IMPL_H_ |
6 #define COMPONENTS_MUS_WS_WINDOW_TREE_IMPL_H_ | 6 #define COMPONENTS_MUS_WS_WINDOW_TREE_IMPL_H_ |
7 | 7 |
8 #include <stdint.h> | 8 #include <stdint.h> |
9 | 9 |
10 #include <map> | 10 #include <map> |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
57 | 57 |
58 mojom::WindowTreeClient* client() { return client_; } | 58 mojom::WindowTreeClient* client() { return client_; } |
59 | 59 |
60 // Returns the Window with the specified id. | 60 // Returns the Window with the specified id. |
61 ServerWindow* GetWindow(const WindowId& id) { | 61 ServerWindow* GetWindow(const WindowId& id) { |
62 return const_cast<ServerWindow*>( | 62 return const_cast<ServerWindow*>( |
63 const_cast<const WindowTreeImpl*>(this)->GetWindow(id)); | 63 const_cast<const WindowTreeImpl*>(this)->GetWindow(id)); |
64 } | 64 } |
65 const ServerWindow* GetWindow(const WindowId& id) const; | 65 const ServerWindow* GetWindow(const WindowId& id) const; |
66 | 66 |
| 67 // Returns the Window with the specified client id *only* if known to this |
| 68 // client, returns null if not known. |
| 69 ServerWindow* GetWindowByClientId(const ClientWindowId& id) { |
| 70 return const_cast<ServerWindow*>( |
| 71 const_cast<const WindowTreeImpl*>(this)->GetWindowByClientId(id)); |
| 72 } |
| 73 const ServerWindow* GetWindowByClientId(const ClientWindowId& id) const; |
| 74 |
| 75 bool IsWindowKnown(const ServerWindow* window) const { |
| 76 return IsWindowKnown(window, nullptr); |
| 77 } |
| 78 // Returns whether |window| is known to this connection. If |window| is |
| 79 // known and |client_window_id| is non-null |client_window_id| is set to |
| 80 // the ClientWindowId of the window. |
| 81 bool IsWindowKnown(const ServerWindow* window, |
| 82 ClientWindowId* client_window_id) const; |
| 83 |
67 // Returns true if |window| is one of this connections roots. | 84 // Returns true if |window| is one of this connections roots. |
68 bool HasRoot(const ServerWindow* window) const; | 85 bool HasRoot(const ServerWindow* window) const; |
69 | 86 |
70 std::set<const ServerWindow*> roots() { return roots_; } | 87 std::set<const ServerWindow*> roots() { return roots_; } |
71 | 88 |
72 bool is_embed_root() const { return is_embed_root_; } | 89 bool is_embed_root() const { return is_embed_root_; } |
73 | 90 |
74 const WindowTreeHostImpl* GetHost(const ServerWindow* window) const; | 91 const WindowTreeHostImpl* GetHost(const ServerWindow* window) const; |
75 WindowTreeHostImpl* GetHost(const ServerWindow* window) { | 92 WindowTreeHostImpl* GetHost(const ServerWindow* window) { |
76 return const_cast<WindowTreeHostImpl*>( | 93 return const_cast<WindowTreeHostImpl*>( |
77 const_cast<const WindowTreeImpl*>(this)->GetHost(window)); | 94 const_cast<const WindowTreeImpl*>(this)->GetHost(window)); |
78 } | 95 } |
79 | 96 |
80 // Invoked when a connection is about to be destroyed. | 97 // Invoked when a connection is about to be destroyed. |
81 void OnWindowDestroyingTreeImpl(WindowTreeImpl* connection); | 98 void OnWindowDestroyingTreeImpl(WindowTreeImpl* connection); |
82 | 99 |
83 void OnWillDestroyWindowTreeHost(WindowTreeHostImpl* tree_host); | 100 void OnWillDestroyWindowTreeHost(WindowTreeHostImpl* tree_host); |
84 | 101 |
85 // These functions are synchronous variants of those defined in the mojom. The | 102 // These functions are synchronous variants of those defined in the mojom. The |
86 // WindowTree implementations all call into these. See the mojom for details. | 103 // WindowTree implementations all call into these. See the mojom for details. |
87 bool NewWindow(const WindowId& window_id, | 104 bool NewWindow(const ClientWindowId& client_window_id, |
88 const std::map<std::string, std::vector<uint8_t>>& properties); | 105 const std::map<std::string, std::vector<uint8_t>>& properties); |
89 bool AddWindow(const WindowId& parent_id, const WindowId& child_id); | 106 bool AddWindow(const ClientWindowId& parent_id, |
90 bool AddTransientWindow(const WindowId& window_id, | 107 const ClientWindowId& child_id); |
91 const WindowId& transient_window_id); | 108 bool AddTransientWindow(const ClientWindowId& window_id, |
| 109 const ClientWindowId& transient_window_id); |
92 std::vector<const ServerWindow*> GetWindowTree( | 110 std::vector<const ServerWindow*> GetWindowTree( |
93 const WindowId& window_id) const; | 111 const ClientWindowId& window_id) const; |
94 bool SetWindowVisibility(const WindowId& window_id, bool visible); | 112 bool SetWindowVisibility(const ClientWindowId& window_id, bool visible); |
95 bool Embed(const WindowId& window_id, | 113 bool Embed(const ClientWindowId& window_id, |
96 mojom::WindowTreeClientPtr client, | 114 mojom::WindowTreeClientPtr client, |
97 uint32_t policy_bitmask, | 115 uint32_t policy_bitmask, |
98 ConnectionSpecificId* connection_id); | 116 ConnectionSpecificId* connection_id); |
99 void DispatchInputEvent(ServerWindow* target, mojom::EventPtr event); | 117 void DispatchInputEvent(ServerWindow* target, mojom::EventPtr event); |
100 | 118 |
101 bool IsWaitingForNewTopLevelWindow(uint32_t wm_change_id); | 119 bool IsWaitingForNewTopLevelWindow(uint32_t wm_change_id); |
102 void OnWindowManagerCreatedTopLevelWindow(uint32_t wm_change_id, | 120 void OnWindowManagerCreatedTopLevelWindow(uint32_t wm_change_id, |
103 uint32_t client_change_id, | 121 uint32_t client_change_id, |
104 const WindowId& window_id); | 122 const ServerWindow* window); |
105 | |
106 // Maps the window id from the client to the server. Normally the ids are the | |
107 // same, but there may be a different id at the embed point. | |
108 WindowId MapWindowIdFromClient(Id transport_window_id) const { | |
109 return MapWindowIdFromClient(WindowIdFromTransportId(transport_window_id)); | |
110 } | |
111 WindowId MapWindowIdFromClient(const WindowId& id) const; | |
112 | |
113 // Maps the window id to the client. | |
114 Id MapWindowIdToClient(const ServerWindow* window) const; | |
115 Id MapWindowIdToClient(const WindowId& id) const; | |
116 | 123 |
117 // Calls through to the client. | 124 // Calls through to the client. |
118 void OnChangeCompleted(uint32_t change_id, bool success); | 125 void OnChangeCompleted(uint32_t change_id, bool success); |
119 | 126 |
120 // The following methods are invoked after the corresponding change has been | 127 // The following methods are invoked after the corresponding change has been |
121 // processed. They do the appropriate bookkeeping and update the client as | 128 // processed. They do the appropriate bookkeeping and update the client as |
122 // necessary. | 129 // necessary. |
123 void ProcessWindowBoundsChanged(const ServerWindow* window, | 130 void ProcessWindowBoundsChanged(const ServerWindow* window, |
124 const gfx::Rect& old_bounds, | 131 const gfx::Rect& old_bounds, |
125 const gfx::Rect& new_bounds, | 132 const gfx::Rect& new_bounds, |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
158 void ProcessFocusChanged(const ServerWindow* old_focused_window, | 165 void ProcessFocusChanged(const ServerWindow* old_focused_window, |
159 const ServerWindow* new_focused_window); | 166 const ServerWindow* new_focused_window); |
160 void ProcessTransientWindowAdded(const ServerWindow* window, | 167 void ProcessTransientWindowAdded(const ServerWindow* window, |
161 const ServerWindow* transient_window, | 168 const ServerWindow* transient_window, |
162 bool originated_change); | 169 bool originated_change); |
163 void ProcessTransientWindowRemoved(const ServerWindow* window, | 170 void ProcessTransientWindowRemoved(const ServerWindow* window, |
164 const ServerWindow* transient_window, | 171 const ServerWindow* transient_window, |
165 bool originated_change); | 172 bool originated_change); |
166 | 173 |
167 private: | 174 private: |
168 using WindowIdSet = base::hash_set<Id>; | |
169 using WindowMap = std::map<ConnectionSpecificId, ServerWindow*>; | |
170 friend class WindowTreeTest; | 175 friend class WindowTreeTest; |
171 | 176 |
172 struct WaitingForTopLevelWindowInfo { | 177 struct WaitingForTopLevelWindowInfo { |
173 WaitingForTopLevelWindowInfo(WindowId window_id, uint32_t wm_change_id) | 178 WaitingForTopLevelWindowInfo(const ClientWindowId& client_window_id, |
174 : window_id(window_id), wm_change_id(wm_change_id) {} | 179 uint32_t wm_change_id) |
| 180 : client_window_id(client_window_id), wm_change_id(wm_change_id) {} |
175 ~WaitingForTopLevelWindowInfo() {} | 181 ~WaitingForTopLevelWindowInfo() {} |
176 | 182 |
177 // Id supplied from the client. | 183 // Id supplied from the client. |
178 WindowId window_id; | 184 ClientWindowId client_window_id; |
179 | 185 |
180 // Change id we created for the window manager. | 186 // Change id we created for the window manager. |
181 uint32_t wm_change_id; | 187 uint32_t wm_change_id; |
182 }; | 188 }; |
183 | 189 |
184 enum class RemoveRootReason { | 190 enum class RemoveRootReason { |
185 // The window is being removed. | 191 // The window is being removed. |
186 DELETED, | 192 DELETED, |
187 | 193 |
188 // Another connection is being embedded in the window. | 194 // Another connection is being embedded in the window. |
189 EMBED, | 195 EMBED, |
190 }; | 196 }; |
191 | 197 |
192 // Used when this connection is associated with the window manager. | 198 // Used when this connection is associated with the window manager. |
193 WindowTreeHostImpl* GetHostForWindowManager(); | 199 WindowTreeHostImpl* GetHostForWindowManager(); |
194 | 200 |
195 bool ShouldRouteToWindowManager(const ServerWindow* window) const; | 201 bool ShouldRouteToWindowManager(const ServerWindow* window) const; |
196 | 202 |
197 bool IsWindowKnown(const ServerWindow* window) const; | 203 ClientWindowId ClientWindowIdForWindow(const ServerWindow* window) const; |
198 | 204 |
199 // Returns true if |id| is a valid WindowId for a new window. | 205 // Returns true if |id| is a valid WindowId for a new window. |
200 bool IsValidIdForNewWindow(const WindowId& id) const; | 206 bool IsValidIdForNewWindow(const ClientWindowId& id) const; |
| 207 |
| 208 WindowId GenerateNewWindowId(); |
201 | 209 |
202 // These functions return true if the corresponding mojom function is allowed | 210 // These functions return true if the corresponding mojom function is allowed |
203 // for this connection. | 211 // for this connection. |
204 bool CanReorderWindow(const ServerWindow* window, | 212 bool CanReorderWindow(const ServerWindow* window, |
205 const ServerWindow* relative_window, | 213 const ServerWindow* relative_window, |
206 mojom::OrderDirection direction) const; | 214 mojom::OrderDirection direction) const; |
207 | 215 |
208 // Deletes a window owned by this connection. Returns true on success. | 216 // Deletes a window owned by this connection. Returns true on success. |
209 // |source| is the connection that originated the change. | 217 // |source| is the connection that originated the change. |
210 bool DeleteWindowImpl(WindowTreeImpl* source, ServerWindow* window); | 218 bool DeleteWindowImpl(WindowTreeImpl* source, ServerWindow* window); |
211 | 219 |
212 // If |window| is known (in |known_windows_|) does nothing. Otherwise adds | 220 // If |window| is known does nothing. Otherwise adds |window| to |windows|, |
213 // |window| to |windows|, marks |window| as known and recurses. | 221 // marks |window| as known and recurses. |
214 void GetUnknownWindowsFrom(const ServerWindow* window, | 222 void GetUnknownWindowsFrom(const ServerWindow* window, |
215 std::vector<const ServerWindow*>* windows); | 223 std::vector<const ServerWindow*>* windows); |
216 | 224 |
217 // Removes |window| and all its descendants from |known_windows_|. This does | 225 // Removes |window| from the appropriate maps. If |window| is known to this |
218 // not recurse through windows that were created by this connection. All | 226 // client true is returned. |
| 227 bool RemoveFromMaps(const ServerWindow* window); |
| 228 |
| 229 // Removes |window| and all its descendants from the necessary maps. This |
| 230 // does not recurse through windows that were created by this connection. All |
219 // windows owned by this connection are added to |local_windows|. | 231 // windows owned by this connection are added to |local_windows|. |
220 void RemoveFromKnown(const ServerWindow* window, | 232 void RemoveFromKnown(const ServerWindow* window, |
221 std::vector<ServerWindow*>* local_windows); | 233 std::vector<ServerWindow*>* local_windows); |
222 | 234 |
223 // Resets the root of this connection. | 235 // Resets the root of this connection. |
224 void RemoveRoot(const ServerWindow* window, RemoveRootReason reason); | 236 void RemoveRoot(const ServerWindow* window, RemoveRootReason reason); |
225 | 237 |
226 // Converts Window(s) to WindowData(s) for transport. This assumes all the | 238 // Converts Window(s) to WindowData(s) for transport. This assumes all the |
227 // windows are valid for the client. The parent of windows the client is not | 239 // windows are valid for the client. The parent of windows the client is not |
228 // allowed to see are set to NULL (in the returned WindowData(s)). | 240 // allowed to see are set to NULL (in the returned WindowData(s)). |
229 mojo::Array<mojom::WindowDataPtr> WindowsToWindowDatas( | 241 mojo::Array<mojom::WindowDataPtr> WindowsToWindowDatas( |
230 const std::vector<const ServerWindow*>& windows); | 242 const std::vector<const ServerWindow*>& windows); |
231 mojom::WindowDataPtr WindowToWindowData(const ServerWindow* window); | 243 mojom::WindowDataPtr WindowToWindowData(const ServerWindow* window); |
232 | 244 |
233 // Implementation of GetWindowTree(). Adds |window| to |windows| and recurses | 245 // Implementation of GetWindowTree(). Adds |window| to |windows| and recurses |
234 // if CanDescendIntoWindowForWindowTree() returns true. | 246 // if CanDescendIntoWindowForWindowTree() returns true. |
235 void GetWindowTreeImpl(const ServerWindow* window, | 247 void GetWindowTreeImpl(const ServerWindow* window, |
236 std::vector<const ServerWindow*>* windows) const; | 248 std::vector<const ServerWindow*>* windows) const; |
237 | 249 |
238 // Notify the client if the drawn state of any of the roots changes. | 250 // Notify the client if the drawn state of any of the roots changes. |
239 // |window| is the window that is changing to the drawn state | 251 // |window| is the window that is changing to the drawn state |
240 // |new_drawn_value|. | 252 // |new_drawn_value|. |
241 void NotifyDrawnStateChanged(const ServerWindow* window, | 253 void NotifyDrawnStateChanged(const ServerWindow* window, |
242 bool new_drawn_value); | 254 bool new_drawn_value); |
243 | 255 |
244 // Deletes all Windows we own. | 256 // Deletes all Windows we own. |
245 void DestroyWindows(); | 257 void DestroyWindows(); |
246 | 258 |
247 bool CanEmbed(const WindowId& window_id, uint32_t policy_bitmask) const; | 259 bool CanEmbed(const ClientWindowId& window_id, uint32_t policy_bitmask) const; |
248 void PrepareForEmbed(const WindowId& window_id); | 260 void PrepareForEmbed(ServerWindow* window); |
249 void RemoveChildrenAsPartOfEmbed(const WindowId& window_id); | 261 void RemoveChildrenAsPartOfEmbed(ServerWindow* window); |
250 | 262 |
251 void DispatchInputEventImpl(ServerWindow* target, mojom::EventPtr event); | 263 void DispatchInputEventImpl(ServerWindow* target, mojom::EventPtr event); |
252 | 264 |
253 // Calls OnChangeCompleted() on the client. | 265 // Calls OnChangeCompleted() on the client. |
254 void NotifyChangeCompleted(uint32_t change_id, | 266 void NotifyChangeCompleted(uint32_t change_id, |
255 mojom::WindowManagerErrorCode error_code); | 267 mojom::WindowManagerErrorCode error_code); |
256 | 268 |
257 // WindowTree: | 269 // WindowTree: |
258 void NewWindow(uint32_t change_id, | 270 void NewWindow(uint32_t change_id, |
259 Id transport_window_id, | 271 Id transport_window_id, |
260 mojo::Map<mojo::String, mojo::Array<uint8_t>> | 272 mojo::Map<mojo::String, mojo::Array<uint8_t>> |
261 transport_properties) override; | 273 transport_properties) override; |
262 void NewTopLevelWindow(uint32_t change_id, | 274 void NewTopLevelWindow(uint32_t change_id, |
263 Id transport_window_id, | 275 Id transport_window_id, |
264 mojo::Map<mojo::String, mojo::Array<uint8_t>> | 276 mojo::Map<mojo::String, mojo::Array<uint8_t>> |
265 transport_properties) override; | 277 transport_properties) override; |
266 void DeleteWindow(uint32_t change_id, Id transport_window_id) override; | 278 void DeleteWindow(uint32_t change_id, Id transport_window_id) override; |
267 void AddWindow(uint32_t change_id, Id parent_id, Id child_id) override; | 279 void AddWindow(uint32_t change_id, Id parent_id, Id child_id) override; |
268 void RemoveWindowFromParent(uint32_t change_id, Id window_id) override; | 280 void RemoveWindowFromParent(uint32_t change_id, Id window_id) override; |
269 void AddTransientWindow(uint32_t change_id, | 281 void AddTransientWindow(uint32_t change_id, |
270 Id window_id, | 282 Id window, |
271 Id transient_window_id) override; | 283 Id transient_window) override; |
272 void RemoveTransientWindowFromParent(uint32_t change_id, | 284 void RemoveTransientWindowFromParent(uint32_t change_id, |
273 Id transient_window_id) override; | 285 Id transient_window_id) override; |
274 void ReorderWindow(uint32_t change_Id, | 286 void ReorderWindow(uint32_t change_Id, |
275 Id window_id, | 287 Id window_id, |
276 Id relative_window_id, | 288 Id relative_window_id, |
277 mojom::OrderDirection direction) override; | 289 mojom::OrderDirection direction) override; |
278 void GetWindowTree( | 290 void GetWindowTree( |
279 Id window_id, | 291 Id window_id, |
280 const mojo::Callback<void(mojo::Array<mojom::WindowDataPtr>)>& callback) | 292 const mojo::Callback<void(mojo::Array<mojom::WindowDataPtr>)>& callback) |
281 override; | 293 override; |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
329 bool IsWindowKnownForAccessPolicy(const ServerWindow* window) const override; | 341 bool IsWindowKnownForAccessPolicy(const ServerWindow* window) const override; |
330 bool IsWindowRootOfAnotherConnectionForAccessPolicy( | 342 bool IsWindowRootOfAnotherConnectionForAccessPolicy( |
331 const ServerWindow* window) const override; | 343 const ServerWindow* window) const override; |
332 bool IsDescendantOfEmbedRoot(const ServerWindow* window) override; | 344 bool IsDescendantOfEmbedRoot(const ServerWindow* window) override; |
333 | 345 |
334 ConnectionManager* connection_manager_; | 346 ConnectionManager* connection_manager_; |
335 | 347 |
336 // Id of this connection as assigned by ConnectionManager. | 348 // Id of this connection as assigned by ConnectionManager. |
337 const ConnectionSpecificId id_; | 349 const ConnectionSpecificId id_; |
338 | 350 |
| 351 ConnectionSpecificId next_window_id_; |
| 352 |
339 mojom::WindowTreeClient* client_; | 353 mojom::WindowTreeClient* client_; |
340 | 354 |
341 scoped_ptr<mus::ws::AccessPolicy> access_policy_; | 355 scoped_ptr<mus::ws::AccessPolicy> access_policy_; |
342 | 356 |
343 // The windows created by this connection. This connection owns these objects. | |
344 WindowMap window_map_; | |
345 | |
346 // The set of windows that has been communicated to the client. | |
347 WindowIdSet known_windows_; | |
348 | |
349 // The roots, or embed points, of this connection. A WindowTreeImpl may have | 357 // The roots, or embed points, of this connection. A WindowTreeImpl may have |
350 // any number of roots, including 0. | 358 // any number of roots, including 0. |
351 std::set<const ServerWindow*> roots_; | 359 std::set<const ServerWindow*> roots_; |
352 | 360 |
| 361 // The windows created by this connection. This connection owns these objects. |
| 362 base::hash_map<WindowId, ServerWindow*> created_window_map_; |
| 363 |
| 364 // The client is allowed to assign ids. These two maps providing the mapping |
| 365 // from the ids native to the server (WindowId) to those understood by the |
| 366 // client (ClientWindowId). |
| 367 base::hash_map<ClientWindowId, WindowId> client_id_to_window_id_map_; |
| 368 base::hash_map<WindowId, ClientWindowId> window_id_to_client_id_map_; |
| 369 |
353 uint32_t event_ack_id_; | 370 uint32_t event_ack_id_; |
354 | 371 |
355 // WindowTreeHostImpl the current event came from. | 372 // WindowTreeHostImpl the current event came from. |
356 WindowTreeHostImpl* event_source_host_; | 373 WindowTreeHostImpl* event_source_host_; |
357 | 374 |
358 bool is_embed_root_; | 375 bool is_embed_root_; |
359 | 376 |
360 std::queue<scoped_ptr<TargetedEvent>> event_queue_; | 377 std::queue<scoped_ptr<TargetedEvent>> event_queue_; |
361 | 378 |
362 scoped_ptr<mojo::AssociatedBinding<mojom::WindowManagerInternalClient>> | 379 scoped_ptr<mojo::AssociatedBinding<mojom::WindowManagerInternalClient>> |
363 window_manager_internal_client_binding_; | 380 window_manager_internal_client_binding_; |
364 mojom::WindowManagerInternal* window_manager_internal_; | 381 mojom::WindowManagerInternal* window_manager_internal_; |
365 | 382 |
366 std::map<WindowId, WindowId> embed_to_real_id_map_; | |
367 | |
368 scoped_ptr<WaitingForTopLevelWindowInfo> waiting_for_top_level_window_info_; | 383 scoped_ptr<WaitingForTopLevelWindowInfo> waiting_for_top_level_window_info_; |
369 | 384 |
370 DISALLOW_COPY_AND_ASSIGN(WindowTreeImpl); | 385 DISALLOW_COPY_AND_ASSIGN(WindowTreeImpl); |
371 }; | 386 }; |
372 | 387 |
373 } // namespace ws | 388 } // namespace ws |
374 } // namespace mus | 389 } // namespace mus |
375 | 390 |
376 #endif // COMPONENTS_MUS_WS_WINDOW_TREE_IMPL_H_ | 391 #endif // COMPONENTS_MUS_WS_WINDOW_TREE_IMPL_H_ |
OLD | NEW |