| 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_
|
|
|