Index: mojo/services/view_manager/connection_manager.h |
diff --git a/mojo/services/view_manager/connection_manager.h b/mojo/services/view_manager/connection_manager.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..73f74a0b76e65b656d9863eb3246162e328cb2cb |
--- /dev/null |
+++ b/mojo/services/view_manager/connection_manager.h |
@@ -0,0 +1,241 @@ |
+// Copyright 2014 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#ifndef SERVICES_VIEW_MANAGER_CONNECTION_MANAGER_H_ |
+#define SERVICES_VIEW_MANAGER_CONNECTION_MANAGER_H_ |
+ |
+#include <map> |
+#include <set> |
+ |
+#include "base/basictypes.h" |
+#include "base/memory/scoped_ptr.h" |
+#include "base/timer/timer.h" |
+#include "mojo/public/cpp/bindings/array.h" |
+#include "mojo/services/view_manager/animation_runner.h" |
+#include "mojo/services/view_manager/ids.h" |
+#include "mojo/services/view_manager/server_view_delegate.h" |
+#include "third_party/mojo_services/src/view_manager/public/interfaces/view_manager.mojom.h" |
+#include "third_party/mojo_services/src/window_manager/public/interfaces/window_manager_internal.mojom.h" |
+ |
+namespace view_manager { |
+ |
+class ClientConnection; |
+class ConnectionManagerDelegate; |
+class DisplayManager; |
+class ServerView; |
+class ViewManagerServiceImpl; |
+ |
+// ConnectionManager manages the set of connections to the ViewManager (all the |
+// ViewManagerServiceImpls) as well as providing the root of the hierarchy. |
+class ConnectionManager : public ServerViewDelegate, |
+ public mojo::WindowManagerInternalClient { |
+ public: |
+ // Create when a ViewManagerServiceImpl is about to make a change. Ensures |
+ // clients are notified correctly. |
+ class ScopedChange { |
+ public: |
+ ScopedChange(ViewManagerServiceImpl* connection, |
+ ConnectionManager* connection_manager, |
+ bool is_delete_view); |
+ ~ScopedChange(); |
+ |
+ mojo::ConnectionSpecificId connection_id() const { return connection_id_; } |
+ bool is_delete_view() const { return is_delete_view_; } |
+ |
+ // Marks the connection with the specified id as having seen a message. |
+ void MarkConnectionAsMessaged(mojo::ConnectionSpecificId connection_id) { |
+ message_ids_.insert(connection_id); |
+ } |
+ |
+ // Returns true if MarkConnectionAsMessaged(connection_id) was invoked. |
+ bool DidMessageConnection(mojo::ConnectionSpecificId connection_id) const { |
+ return message_ids_.count(connection_id) > 0; |
+ } |
+ |
+ private: |
+ ConnectionManager* connection_manager_; |
+ const mojo::ConnectionSpecificId connection_id_; |
+ const bool is_delete_view_; |
+ |
+ // See description of MarkConnectionAsMessaged/DidMessageConnection. |
+ std::set<mojo::ConnectionSpecificId> message_ids_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(ScopedChange); |
+ }; |
+ |
+ ConnectionManager(ConnectionManagerDelegate* delegate, |
+ scoped_ptr<DisplayManager> display_manager, |
+ mojo::WindowManagerInternal* wm_internal); |
+ ~ConnectionManager() override; |
+ |
+ // Returns the id for the next ViewManagerServiceImpl. |
+ mojo::ConnectionSpecificId GetAndAdvanceNextConnectionId(); |
+ |
+ // Invoked when a ViewManagerServiceImpl's connection encounters an error. |
+ void OnConnectionError(ClientConnection* connection); |
+ |
+ // See description of ViewManagerService::Embed() for details. This assumes |
+ // |transport_view_id| is valid. |
+ void EmbedAtView(mojo::ConnectionSpecificId creator_id, |
+ const std::string& url, |
+ const ViewId& view_id, |
+ mojo::InterfaceRequest<mojo::ServiceProvider> services, |
+ mojo::ServiceProviderPtr exposed_services); |
+ void EmbedAtView(mojo::ConnectionSpecificId creator_id, |
+ const ViewId& view_id, |
+ mojo::ViewManagerClientPtr client); |
+ |
+ // Returns the connection by id. |
+ ViewManagerServiceImpl* GetConnection( |
+ mojo::ConnectionSpecificId connection_id); |
+ |
+ // Returns the View identified by |id|. |
+ ServerView* GetView(const ViewId& id); |
+ |
+ ServerView* root() { return root_.get(); } |
+ DisplayManager* display_manager() { return display_manager_.get(); } |
+ |
+ bool IsProcessingChange() const { return current_change_ != NULL; } |
+ |
+ bool is_processing_delete_view() const { |
+ return current_change_ && current_change_->is_delete_view(); |
+ } |
+ |
+ // Invoked when a connection messages a client about the change. This is used |
+ // to avoid sending ServerChangeIdAdvanced() unnecessarily. |
+ void OnConnectionMessagedClient(mojo::ConnectionSpecificId id); |
+ |
+ // Returns true if OnConnectionMessagedClient() was invoked for id. |
+ bool DidConnectionMessageClient(mojo::ConnectionSpecificId id) const; |
+ |
+ // Returns the ViewManagerServiceImpl that has |id| as a root. |
+ ViewManagerServiceImpl* GetConnectionWithRoot(const ViewId& id) { |
+ return const_cast<ViewManagerServiceImpl*>( |
+ const_cast<const ConnectionManager*>(this)->GetConnectionWithRoot(id)); |
+ } |
+ const ViewManagerServiceImpl* GetConnectionWithRoot(const ViewId& id) const; |
+ |
+ mojo::WindowManagerInternal* wm_internal() { return wm_internal_; } |
+ |
+ void SetWindowManagerClientConnection( |
+ scoped_ptr<ClientConnection> connection); |
+ bool has_window_manager_client_connection() const { |
+ return window_manager_client_connection_ != nullptr; |
+ } |
+ |
+ mojo::ViewManagerClient* GetWindowManagerViewManagerClient(); |
+ |
+ // WindowManagerInternalClient implementation helper; see mojom for details. |
+ bool CloneAndAnimate(const ViewId& view_id); |
+ |
+ // These functions trivially delegate to all ViewManagerServiceImpls, which in |
+ // term notify their clients. |
+ void ProcessViewDestroyed(ServerView* view); |
+ void ProcessViewBoundsChanged(const ServerView* view, |
+ const gfx::Rect& old_bounds, |
+ const gfx::Rect& new_bounds); |
+ void ProcessViewportMetricsChanged(const mojo::ViewportMetrics& old_metrics, |
+ const mojo::ViewportMetrics& new_metrics); |
+ void ProcessWillChangeViewHierarchy(const ServerView* view, |
+ const ServerView* new_parent, |
+ const ServerView* old_parent); |
+ void ProcessViewHierarchyChanged(const ServerView* view, |
+ const ServerView* new_parent, |
+ const ServerView* old_parent); |
+ void ProcessViewReorder(const ServerView* view, |
+ const ServerView* relative_view, |
+ const mojo::OrderDirection direction); |
+ void ProcessViewDeleted(const ViewId& view); |
+ |
+ private: |
+ typedef std::map<mojo::ConnectionSpecificId, ClientConnection*> ConnectionMap; |
+ |
+ // Invoked when a connection is about to make a change. Subsequently followed |
+ // by FinishChange() once the change is done. |
+ // |
+ // Changes should never nest, meaning each PrepareForChange() must be |
+ // balanced with a call to FinishChange() with no PrepareForChange() |
+ // in between. |
+ void PrepareForChange(ScopedChange* change); |
+ |
+ // Balances a call to PrepareForChange(). |
+ void FinishChange(); |
+ |
+ // Returns true if the specified connection originated the current change. |
+ bool IsChangeSource(mojo::ConnectionSpecificId connection_id) const { |
+ return current_change_ && current_change_->connection_id() == connection_id; |
+ } |
+ |
+ // Adds |connection| to internal maps. |
+ void AddConnection(ClientConnection* connection); |
+ |
+ // Callback from animation timer. |
+ // TODO(sky): make this real (move to a different class). |
+ void DoAnimation(); |
+ |
+ // Overridden from ServerViewDelegate: |
+ void OnWillDestroyView(ServerView* view) override; |
+ void OnViewDestroyed(const ServerView* view) override; |
+ void OnWillChangeViewHierarchy(ServerView* view, |
+ ServerView* new_parent, |
+ ServerView* old_parent) override; |
+ void OnViewHierarchyChanged(const ServerView* view, |
+ const ServerView* new_parent, |
+ const ServerView* old_parent) override; |
+ void OnViewBoundsChanged(const ServerView* view, |
+ const gfx::Rect& old_bounds, |
+ const gfx::Rect& new_bounds) override; |
+ void OnViewSurfaceIdChanged(const ServerView* view) override; |
+ void OnViewReordered(const ServerView* view, |
+ const ServerView* relative, |
+ mojo::OrderDirection direction) override; |
+ void OnWillChangeViewVisibility(ServerView* view) override; |
+ void OnViewSharedPropertyChanged( |
+ const ServerView* view, |
+ const std::string& name, |
+ const std::vector<uint8_t>* new_data) override; |
+ void OnScheduleViewPaint(const ServerView* view) override; |
+ |
+ // WindowManagerInternalClient: |
+ void DispatchInputEventToView(mojo::Id transport_view_id, |
+ mojo::EventPtr event) override; |
+ void SetViewportSize(mojo::SizePtr size) override; |
+ void CloneAndAnimate(mojo::Id transport_view_id) override; |
+ |
+ ConnectionManagerDelegate* delegate_; |
+ |
+ // The ClientConnection containing the ViewManagerService implementation |
+ // provided to the initial connection (the WindowManager). |
+ // NOTE: |window_manager_client_connection_| is also in |connection_map_|. |
+ ClientConnection* window_manager_client_connection_; |
+ |
+ // ID to use for next ViewManagerServiceImpl. |
+ mojo::ConnectionSpecificId next_connection_id_; |
+ |
+ // Set of ViewManagerServiceImpls. |
+ ConnectionMap connection_map_; |
+ |
+ scoped_ptr<DisplayManager> display_manager_; |
+ |
+ scoped_ptr<ServerView> root_; |
+ |
+ mojo::WindowManagerInternal* wm_internal_; |
+ |
+ // If non-null we're processing a change. The ScopedChange is not owned by us |
+ // (it's created on the stack by ViewManagerServiceImpl). |
+ ScopedChange* current_change_; |
+ |
+ bool in_destructor_; |
+ |
+ // TODO(sky): nuke! Just a proof of concept until get real animation api. |
+ base::RepeatingTimer<ConnectionManager> animation_timer_; |
+ |
+ AnimationRunner animation_runner_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(ConnectionManager); |
+}; |
+ |
+} // namespace view_manager |
+ |
+#endif // SERVICES_VIEW_MANAGER_CONNECTION_MANAGER_H_ |