Index: components/mus/ws/window_tree_impl.h |
diff --git a/components/mus/ws/window_tree_impl.h b/components/mus/ws/window_tree_impl.h |
index af39c28f4012d0cb6b39c193d6c8b011274f3278..2ebc38367d729318951fcaa723a30f80cbd6b821 100644 |
--- a/components/mus/ws/window_tree_impl.h |
+++ b/components/mus/ws/window_tree_impl.h |
@@ -64,6 +64,23 @@ class WindowTreeImpl : public mojom::WindowTree, |
} |
const ServerWindow* GetWindow(const WindowId& id) const; |
+ // Returns the Window with the specified client id *only* if known to this |
+ // client, returns null if not known. |
+ ServerWindow* GetWindowByClientId(const ClientWindowId& id) { |
+ return const_cast<ServerWindow*>( |
+ const_cast<const WindowTreeImpl*>(this)->GetWindowByClientId(id)); |
+ } |
+ const ServerWindow* GetWindowByClientId(const ClientWindowId& id) const; |
+ |
+ bool IsWindowKnown(const ServerWindow* window) const { |
+ return IsWindowKnown(window, nullptr); |
+ } |
+ // Returns whether |window| is known to this connection. If |window| is |
+ // known and |client_window_id| is non-null |client_window_id| is set to |
+ // the ClientWindowId of the window. |
+ bool IsWindowKnown(const ServerWindow* window, |
+ ClientWindowId* client_window_id) const; |
+ |
// Returns true if |window| is one of this connections roots. |
bool HasRoot(const ServerWindow* window) const; |
@@ -84,15 +101,16 @@ class WindowTreeImpl : public mojom::WindowTree, |
// These functions are synchronous variants of those defined in the mojom. The |
// WindowTree implementations all call into these. See the mojom for details. |
- bool NewWindow(const WindowId& window_id, |
+ bool NewWindow(const ClientWindowId& client_window_id, |
const std::map<std::string, std::vector<uint8_t>>& properties); |
- bool AddWindow(const WindowId& parent_id, const WindowId& child_id); |
- bool AddTransientWindow(const WindowId& window_id, |
- const WindowId& transient_window_id); |
+ bool AddWindow(const ClientWindowId& parent_id, |
+ const ClientWindowId& child_id); |
+ bool AddTransientWindow(const ClientWindowId& window_id, |
+ const ClientWindowId& transient_window_id); |
std::vector<const ServerWindow*> GetWindowTree( |
- const WindowId& window_id) const; |
- bool SetWindowVisibility(const WindowId& window_id, bool visible); |
- bool Embed(const WindowId& window_id, |
+ const ClientWindowId& window_id) const; |
+ bool SetWindowVisibility(const ClientWindowId& window_id, bool visible); |
+ bool Embed(const ClientWindowId& window_id, |
mojom::WindowTreeClientPtr client, |
uint32_t policy_bitmask, |
ConnectionSpecificId* connection_id); |
@@ -101,18 +119,7 @@ class WindowTreeImpl : public mojom::WindowTree, |
bool IsWaitingForNewTopLevelWindow(uint32_t wm_change_id); |
void OnWindowManagerCreatedTopLevelWindow(uint32_t wm_change_id, |
uint32_t client_change_id, |
- const WindowId& window_id); |
- |
- // Maps the window id from the client to the server. Normally the ids are the |
- // same, but there may be a different id at the embed point. |
- WindowId MapWindowIdFromClient(Id transport_window_id) const { |
- return MapWindowIdFromClient(WindowIdFromTransportId(transport_window_id)); |
- } |
- WindowId MapWindowIdFromClient(const WindowId& id) const; |
- |
- // Maps the window id to the client. |
- Id MapWindowIdToClient(const ServerWindow* window) const; |
- Id MapWindowIdToClient(const WindowId& id) const; |
+ const ServerWindow* window); |
// Calls through to the client. |
void OnChangeCompleted(uint32_t change_id, bool success); |
@@ -165,17 +172,16 @@ class WindowTreeImpl : public mojom::WindowTree, |
bool originated_change); |
private: |
- using WindowIdSet = base::hash_set<Id>; |
- using WindowMap = std::map<ConnectionSpecificId, ServerWindow*>; |
friend class WindowTreeTest; |
struct WaitingForTopLevelWindowInfo { |
- WaitingForTopLevelWindowInfo(WindowId window_id, uint32_t wm_change_id) |
- : window_id(window_id), wm_change_id(wm_change_id) {} |
+ WaitingForTopLevelWindowInfo(const ClientWindowId& client_window_id, |
+ uint32_t wm_change_id) |
+ : client_window_id(client_window_id), wm_change_id(wm_change_id) {} |
~WaitingForTopLevelWindowInfo() {} |
// Id supplied from the client. |
- WindowId window_id; |
+ ClientWindowId client_window_id; |
// Change id we created for the window manager. |
uint32_t wm_change_id; |
@@ -194,10 +200,12 @@ class WindowTreeImpl : public mojom::WindowTree, |
bool ShouldRouteToWindowManager(const ServerWindow* window) const; |
- bool IsWindowKnown(const ServerWindow* window) const; |
+ ClientWindowId ClientWindowIdForWindow(const ServerWindow* window) const; |
// Returns true if |id| is a valid WindowId for a new window. |
- bool IsValidIdForNewWindow(const WindowId& id) const; |
+ bool IsValidIdForNewWindow(const ClientWindowId& id) const; |
+ |
+ WindowId GenerateNewWindowId(); |
// These functions return true if the corresponding mojom function is allowed |
// for this connection. |
@@ -209,13 +217,17 @@ class WindowTreeImpl : public mojom::WindowTree, |
// |source| is the connection that originated the change. |
bool DeleteWindowImpl(WindowTreeImpl* source, ServerWindow* window); |
- // If |window| is known (in |known_windows_|) does nothing. Otherwise adds |
- // |window| to |windows|, marks |window| as known and recurses. |
+ // If |window| is known does nothing. Otherwise adds |window| to |windows|, |
+ // marks |window| as known and recurses. |
void GetUnknownWindowsFrom(const ServerWindow* window, |
std::vector<const ServerWindow*>* windows); |
- // Removes |window| and all its descendants from |known_windows_|. This does |
- // not recurse through windows that were created by this connection. All |
+ // Removes |window| from the appropriate maps. If |window| is known to this |
+ // client true is returned. |
+ bool RemoveFromMaps(const ServerWindow* window); |
+ |
+ // Removes |window| and all its descendants from the necessary maps. This |
+ // does not recurse through windows that were created by this connection. All |
// windows owned by this connection are added to |local_windows|. |
void RemoveFromKnown(const ServerWindow* window, |
std::vector<ServerWindow*>* local_windows); |
@@ -244,9 +256,9 @@ class WindowTreeImpl : public mojom::WindowTree, |
// Deletes all Windows we own. |
void DestroyWindows(); |
- bool CanEmbed(const WindowId& window_id, uint32_t policy_bitmask) const; |
- void PrepareForEmbed(const WindowId& window_id); |
- void RemoveChildrenAsPartOfEmbed(const WindowId& window_id); |
+ bool CanEmbed(const ClientWindowId& window_id, uint32_t policy_bitmask) const; |
+ void PrepareForEmbed(ServerWindow* window); |
+ void RemoveChildrenAsPartOfEmbed(ServerWindow* window); |
void DispatchInputEventImpl(ServerWindow* target, mojom::EventPtr event); |
@@ -267,8 +279,8 @@ class WindowTreeImpl : public mojom::WindowTree, |
void AddWindow(uint32_t change_id, Id parent_id, Id child_id) override; |
void RemoveWindowFromParent(uint32_t change_id, Id window_id) override; |
void AddTransientWindow(uint32_t change_id, |
- Id window_id, |
- Id transient_window_id) override; |
+ Id window, |
+ Id transient_window) override; |
void RemoveTransientWindowFromParent(uint32_t change_id, |
Id transient_window_id) override; |
void ReorderWindow(uint32_t change_Id, |
@@ -336,20 +348,25 @@ class WindowTreeImpl : public mojom::WindowTree, |
// Id of this connection as assigned by ConnectionManager. |
const ConnectionSpecificId id_; |
+ ConnectionSpecificId next_window_id_; |
+ |
mojom::WindowTreeClient* client_; |
scoped_ptr<mus::ws::AccessPolicy> access_policy_; |
- // The windows created by this connection. This connection owns these objects. |
- WindowMap window_map_; |
- |
- // The set of windows that has been communicated to the client. |
- WindowIdSet known_windows_; |
- |
// The roots, or embed points, of this connection. A WindowTreeImpl may have |
// any number of roots, including 0. |
std::set<const ServerWindow*> roots_; |
+ // The windows created by this connection. This connection owns these objects. |
+ base::hash_map<WindowId, ServerWindow*> created_window_map_; |
+ |
+ // The client is allowed to assign ids. These two maps providing the mapping |
+ // from the ids native to the server (WindowId) to those understood by the |
+ // client (ClientWindowId). |
+ base::hash_map<ClientWindowId, WindowId> client_id_to_window_id_map_; |
+ base::hash_map<WindowId, ClientWindowId> window_id_to_client_id_map_; |
+ |
uint32_t event_ack_id_; |
// WindowTreeHostImpl the current event came from. |
@@ -363,8 +380,6 @@ class WindowTreeImpl : public mojom::WindowTree, |
window_manager_internal_client_binding_; |
mojom::WindowManagerInternal* window_manager_internal_; |
- std::map<WindowId, WindowId> embed_to_real_id_map_; |
- |
scoped_ptr<WaitingForTopLevelWindowInfo> waiting_for_top_level_window_info_; |
DISALLOW_COPY_AND_ASSIGN(WindowTreeImpl); |