Chromium Code Reviews| 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 MOJO_SERVICES_VIEW_MANAGER_VIEW_MANAGER_SERVICE_IMPL_H_ | 5 #ifndef MOJO_SERVICES_VIEW_MANAGER_VIEW_MANAGER_SERVICE_IMPL_H_ |
| 6 #define MOJO_SERVICES_VIEW_MANAGER_VIEW_MANAGER_SERVICE_IMPL_H_ | 6 #define MOJO_SERVICES_VIEW_MANAGER_VIEW_MANAGER_SERVICE_IMPL_H_ |
| 7 | 7 |
| 8 #include <set> | 8 #include <set> |
| 9 #include <string> | 9 #include <string> |
| 10 #include <vector> | 10 #include <vector> |
| 11 | 11 |
| 12 #include "base/basictypes.h" | 12 #include "base/basictypes.h" |
| 13 #include "base/compiler_specific.h" | 13 #include "base/compiler_specific.h" |
| 14 #include "base/containers/hash_tables.h" | 14 #include "base/containers/hash_tables.h" |
| 15 #include "base/memory/scoped_ptr.h" | |
| 15 #include "mojo/services/public/interfaces/view_manager/view_manager.mojom.h" | 16 #include "mojo/services/public/interfaces/view_manager/view_manager.mojom.h" |
| 17 #include "mojo/services/view_manager/access_policy_delegate.h" | |
| 16 #include "mojo/services/view_manager/ids.h" | 18 #include "mojo/services/view_manager/ids.h" |
| 17 #include "mojo/services/view_manager/view_manager_export.h" | 19 #include "mojo/services/view_manager/view_manager_export.h" |
| 18 | 20 |
| 19 namespace gfx { | 21 namespace gfx { |
| 20 class Rect; | 22 class Rect; |
| 21 } | 23 } |
| 22 | 24 |
| 23 namespace mojo { | 25 namespace mojo { |
| 24 namespace service { | 26 namespace service { |
| 25 | 27 |
| 28 class AccessPolicy; | |
| 26 class Node; | 29 class Node; |
| 27 class RootNodeManager; | 30 class RootNodeManager; |
| 28 class View; | 31 class View; |
| 29 | 32 |
| 30 #if defined(OS_WIN) | 33 #if defined(OS_WIN) |
| 31 // Equivalent of NON_EXPORTED_BASE which does not work with the template snafu | 34 // Equivalent of NON_EXPORTED_BASE which does not work with the template snafu |
| 32 // below. | 35 // below. |
| 33 #pragma warning(push) | 36 #pragma warning(push) |
| 34 #pragma warning(disable : 4275) | 37 #pragma warning(disable : 4275) |
| 35 #endif | 38 #endif |
| 36 | 39 |
| 37 // Manages a connection from the client. | 40 // Manages a connection from the client. |
| 38 class MOJO_VIEW_MANAGER_EXPORT ViewManagerServiceImpl | 41 class MOJO_VIEW_MANAGER_EXPORT ViewManagerServiceImpl |
| 39 : public InterfaceImpl<ViewManagerService> { | 42 : public InterfaceImpl<ViewManagerService>, |
| 43 public AccessPolicyDelegate { | |
| 40 public: | 44 public: |
| 41 ViewManagerServiceImpl(RootNodeManager* root_node_manager, | 45 ViewManagerServiceImpl(RootNodeManager* root_node_manager, |
| 42 ConnectionSpecificId creator_id, | 46 ConnectionSpecificId creator_id, |
| 43 const std::string& creator_url, | 47 const std::string& creator_url, |
| 44 const std::string& url, | 48 const std::string& url, |
| 45 const NodeId& root_id); | 49 const NodeId& root_id); |
| 46 virtual ~ViewManagerServiceImpl(); | 50 virtual ~ViewManagerServiceImpl(); |
| 47 | 51 |
| 48 // Used to mark this connection as originating from a call to | 52 // Used to mark this connection as originating from a call to |
| 49 // ViewManagerService::Connect(). When set OnConnectionError() deletes |this|. | 53 // ViewManagerService::Connect(). When set OnConnectionError() deletes |this|. |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 101 // TODO(sky): move this to private section (currently can't because of | 105 // TODO(sky): move this to private section (currently can't because of |
| 102 // bindings). | 106 // bindings). |
| 103 // InterfaceImp overrides: | 107 // InterfaceImp overrides: |
| 104 virtual void OnConnectionError() MOJO_OVERRIDE; | 108 virtual void OnConnectionError() MOJO_OVERRIDE; |
| 105 | 109 |
| 106 private: | 110 private: |
| 107 typedef std::map<ConnectionSpecificId, Node*> NodeMap; | 111 typedef std::map<ConnectionSpecificId, Node*> NodeMap; |
| 108 typedef std::map<ConnectionSpecificId, View*> ViewMap; | 112 typedef std::map<ConnectionSpecificId, View*> ViewMap; |
| 109 typedef base::hash_set<Id> NodeIdSet; | 113 typedef base::hash_set<Id> NodeIdSet; |
| 110 | 114 |
| 115 bool IsNodeKnown(const Node* node) const; | |
| 116 | |
| 111 // These functions return true if the corresponding mojom function is allowed | 117 // These functions return true if the corresponding mojom function is allowed |
| 112 // for this connection. | 118 // for this connection. |
| 113 bool CanRemoveNodeFromParent(const Node* node) const; | |
| 114 bool CanAddNode(const Node* parent, const Node* child) const; | |
| 115 bool CanReorderNode(const Node* node, | 119 bool CanReorderNode(const Node* node, |
| 116 const Node* relative_node, | 120 const Node* relative_node, |
| 117 OrderDirection direction) const; | 121 OrderDirection direction) const; |
| 118 bool CanDeleteNode(const NodeId& node_id) const; | |
| 119 bool CanDeleteView(const ViewId& view_id) const; | |
| 120 bool CanSetView(const Node* node, const ViewId& view_id) const; | |
| 121 bool CanSetFocus(const Node* node) const; | |
| 122 bool CanGetNodeTree(const Node* node) const; | |
| 123 bool CanEmbed(Id transport_node_id) const; | |
| 124 bool CanSetNodeVisibility(const Node* node, bool visible) const; | |
| 125 // Used during GetNodeTreeImpl() to decide if we should descend into |node| | |
| 126 // when building the results of GetNodeTree(). | |
| 127 bool CanDescendIntoNodeForNodeTree(const Node* node) const; | |
| 128 | 122 |
| 129 // Deletes a node owned by this connection. Returns true on success. |source| | 123 // Deletes a node owned by this connection. Returns true on success. |source| |
| 130 // is the connection that originated the change. | 124 // is the connection that originated the change. |
| 131 bool DeleteNodeImpl(ViewManagerServiceImpl* source, const NodeId& node_id); | 125 bool DeleteNodeImpl(ViewManagerServiceImpl* source, Node* node); |
| 132 | 126 |
| 133 // Deletes a view owned by this connection. Returns true on success. |source| | 127 // Deletes a view owned by this connection. Returns true on success. |source| |
| 134 // is the connection that originated the change. | 128 // is the connection that originated the change. |
| 135 bool DeleteViewImpl(ViewManagerServiceImpl* source, const ViewId& view_id); | 129 bool DeleteViewImpl(ViewManagerServiceImpl* source, View* view); |
| 136 | 130 |
| 137 // Sets the view associated with a node. | 131 // Sets the view associated with a node. |
| 138 bool SetViewImpl(Node* node, const ViewId& view_id); | 132 bool SetViewImpl(Node* node, View* view); |
| 139 | 133 |
| 140 // If |node| is known (in |known_nodes_|) does nothing. Otherwise adds |node| | 134 // If |node| is known (in |known_nodes_|) does nothing. Otherwise adds |node| |
| 141 // to |nodes|, marks |node| as known and recurses. | 135 // to |nodes|, marks |node| as known and recurses. |
| 142 void GetUnknownNodesFrom(const Node* node, std::vector<const Node*>* nodes); | 136 void GetUnknownNodesFrom(const Node* node, std::vector<const Node*>* nodes); |
| 143 | 137 |
| 144 // Returns true if node (or one of its ancestors) is embedded in another | |
| 145 // connection. | |
| 146 bool IsNodeEmbeddedInAnotherConnection(const Node* node) const; | |
| 147 | |
| 148 // Removes |node| and all its descendants from |known_nodes_|. This does not | 138 // Removes |node| and all its descendants from |known_nodes_|. This does not |
| 149 // recurse through nodes that were created by this connection. All nodes owned | 139 // recurse through nodes that were created by this connection. All nodes owned |
| 150 // by this connection are added to |local_nodes|. | 140 // by this connection are added to |local_nodes|. |
| 151 void RemoveFromKnown(const Node* node, std::vector<Node*>* local_nodes); | 141 void RemoveFromKnown(const Node* node, std::vector<Node*>* local_nodes); |
| 152 | 142 |
| 153 // Adds |node_id| to the set of roots this connection knows about. The caller | 143 // Adds |node_id| to the set of roots this connection knows about. The caller |
| 154 // should have verified |node_id| is not among the roots of this connection. | 144 // should have verified |node_id| is not among the roots of this connection. |
| 155 void AddRoot(const NodeId& node_id); | 145 void AddRoot(const NodeId& node_id); |
| 156 | 146 |
| 157 // Removes |node_id| from the set of roots this connection knows about. | 147 // Removes |node_id| from the set of roots this connection knows about. |
| 158 void RemoveRoot(const NodeId& node_id); | 148 void RemoveRoot(const NodeId& node_id); |
| 159 | 149 |
| 160 void RemoveChildrenAsPartOfEmbed(const NodeId& node_id); | 150 void RemoveChildrenAsPartOfEmbed(const NodeId& node_id); |
| 161 | 151 |
| 162 // Returns true if |node| is a non-null and a descendant of |roots_| (or | |
| 163 // |roots_| is empty). | |
| 164 bool IsNodeDescendantOfRoots(const Node* node) const; | |
| 165 | |
| 166 // Returns true if notification should be sent of a hierarchy change. If true | |
| 167 // is returned, any nodes that need to be sent to the client are added to | |
| 168 // |to_send|. | |
| 169 bool ShouldNotifyOnHierarchyChange(const Node* node, | |
| 170 const Node** new_parent, | |
| 171 const Node** old_parent, | |
| 172 std::vector<const Node*>* to_send); | |
| 173 | |
| 174 // Converts an array of Nodes to NodeDatas. This assumes all the nodes are | 152 // Converts an array of Nodes to NodeDatas. This assumes all the nodes are |
| 175 // valid for the client. The parent of nodes the client is not allowed to see | 153 // valid for the client. The parent of nodes the client is not allowed to see |
| 176 // are set to NULL (in the returned NodeDatas). | 154 // are set to NULL (in the returned NodeDatas). |
| 177 Array<NodeDataPtr> NodesToNodeDatas(const std::vector<const Node*>& nodes); | 155 Array<NodeDataPtr> NodesToNodeDatas(const std::vector<const Node*>& nodes); |
| 178 | 156 |
| 179 // Implementation of GetNodeTree(). Adds |node| to |nodes| and recurses if | 157 // Implementation of GetNodeTree(). Adds |node| to |nodes| and recurses if |
| 180 // CanDescendIntoNodeForNodeTree() returns true. | 158 // CanDescendIntoNodeForNodeTree() returns true. |
| 181 void GetNodeTreeImpl(const Node* node, std::vector<const Node*>* nodes) const; | 159 void GetNodeTreeImpl(const Node* node, std::vector<const Node*>* nodes) const; |
| 182 | 160 |
| 183 // ViewManagerService: | 161 // ViewManagerService: |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 216 const Callback<void(bool)>& callback) OVERRIDE; | 194 const Callback<void(bool)>& callback) OVERRIDE; |
| 217 virtual void SetNodeVisibility(Id transport_node_id, | 195 virtual void SetNodeVisibility(Id transport_node_id, |
| 218 bool visible, | 196 bool visible, |
| 219 const Callback<void(bool)>& callback) OVERRIDE; | 197 const Callback<void(bool)>& callback) OVERRIDE; |
| 220 virtual void Embed(const String& url, | 198 virtual void Embed(const String& url, |
| 221 Id transport_node_id, | 199 Id transport_node_id, |
| 222 const Callback<void(bool)>& callback) OVERRIDE; | 200 const Callback<void(bool)>& callback) OVERRIDE; |
| 223 virtual void DispatchOnViewInputEvent(Id transport_view_id, | 201 virtual void DispatchOnViewInputEvent(Id transport_view_id, |
| 224 EventPtr event) OVERRIDE; | 202 EventPtr event) OVERRIDE; |
| 225 | 203 |
| 226 // InterfaceImp overrides: | 204 // InterfaceImp: |
|
Ben Goodger (Google)
2014/07/25 20:51:46
InterfaceImpl
sky
2014/07/25 21:10:46
Done.
| |
| 227 virtual void OnConnectionEstablished() MOJO_OVERRIDE; | 205 virtual void OnConnectionEstablished() MOJO_OVERRIDE; |
| 228 | 206 |
| 207 // AccessPolicyDelegate: | |
| 208 virtual const base::hash_set<Id>& GetRootsForAccessPolicy() const OVERRIDE; | |
| 209 virtual bool IsNodeKnownForAccessPolicy(const Node* node) const OVERRIDE; | |
| 210 virtual bool IsNodeEmbeddedInAnotherConnectionForAccessPolicy( | |
| 211 const Node* node) const OVERRIDE; | |
| 212 | |
| 229 RootNodeManager* root_node_manager_; | 213 RootNodeManager* root_node_manager_; |
| 230 | 214 |
| 231 // Id of this connection as assigned by RootNodeManager. | 215 // Id of this connection as assigned by RootNodeManager. |
| 232 const ConnectionSpecificId id_; | 216 const ConnectionSpecificId id_; |
| 233 | 217 |
| 234 // URL this connection was created for. | 218 // URL this connection was created for. |
| 235 const std::string url_; | 219 const std::string url_; |
| 236 | 220 |
| 237 // ID of the connection that created us. If 0 it indicates either we were | 221 // ID of the connection that created us. If 0 it indicates either we were |
| 238 // created by the root, or the connection that created us has been destroyed. | 222 // created by the root, or the connection that created us has been destroyed. |
| 239 ConnectionSpecificId creator_id_; | 223 ConnectionSpecificId creator_id_; |
| 240 | 224 |
| 241 // The URL of the app that embedded the app this connection was created for. | 225 // The URL of the app that embedded the app this connection was created for. |
| 242 const std::string creator_url_; | 226 const std::string creator_url_; |
| 243 | 227 |
| 228 scoped_ptr<AccessPolicy> access_policy_; | |
| 229 | |
| 244 // The nodes and views created by this connection. This connection owns these | 230 // The nodes and views created by this connection. This connection owns these |
| 245 // objects. | 231 // objects. |
| 246 NodeMap node_map_; | 232 NodeMap node_map_; |
| 247 ViewMap view_map_; | 233 ViewMap view_map_; |
| 248 | 234 |
| 249 // The set of nodes that has been communicated to the client. | 235 // The set of nodes that has been communicated to the client. |
| 250 NodeIdSet known_nodes_; | 236 NodeIdSet known_nodes_; |
| 251 | 237 |
| 252 // This is the set of nodes the connection can parent nodes to (in addition to | 238 // This is the set of nodes the connection can parent nodes to (in addition to |
| 253 // any nodes created by this connection). If empty the connection can | 239 // any nodes created by this connection). If empty the connection can |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 264 }; | 250 }; |
| 265 | 251 |
| 266 #if defined(OS_WIN) | 252 #if defined(OS_WIN) |
| 267 #pragma warning(pop) | 253 #pragma warning(pop) |
| 268 #endif | 254 #endif |
| 269 | 255 |
| 270 } // namespace service | 256 } // namespace service |
| 271 } // namespace mojo | 257 } // namespace mojo |
| 272 | 258 |
| 273 #endif // MOJO_SERVICES_VIEW_MANAGER_VIEW_MANAGER_SERVICE_IMPL_H_ | 259 #endif // MOJO_SERVICES_VIEW_MANAGER_VIEW_MANAGER_SERVICE_IMPL_H_ |
| OLD | NEW |