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 #include "mojo/services/view_manager/view_manager_service_impl.h" | 5 #include "mojo/services/view_manager/view_manager_service_impl.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "mojo/services/public/cpp/geometry/geometry_type_converters.h" | 8 #include "mojo/services/public/cpp/geometry/geometry_type_converters.h" |
9 #include "mojo/services/public/cpp/input_events/input_events_type_converters.h" | 9 #include "mojo/services/public/cpp/input_events/input_events_type_converters.h" |
10 #include "mojo/services/view_manager/default_access_policy.h" | 10 #include "mojo/services/view_manager/default_access_policy.h" |
(...skipping 13 matching lines...) Expand all Loading... |
24 ConnectionSpecificId creator_id, | 24 ConnectionSpecificId creator_id, |
25 const std::string& creator_url, | 25 const std::string& creator_url, |
26 const std::string& url, | 26 const std::string& url, |
27 const NodeId& root_id) | 27 const NodeId& root_id) |
28 : root_node_manager_(root_node_manager), | 28 : root_node_manager_(root_node_manager), |
29 id_(root_node_manager_->GetAndAdvanceNextConnectionId()), | 29 id_(root_node_manager_->GetAndAdvanceNextConnectionId()), |
30 url_(url), | 30 url_(url), |
31 creator_id_(creator_id), | 31 creator_id_(creator_id), |
32 creator_url_(creator_url), | 32 creator_url_(creator_url), |
33 delete_on_connection_error_(false) { | 33 delete_on_connection_error_(false) { |
34 // TODO: http://crbug.com/397660 . | 34 CHECK(GetNode(root_id)); |
35 if (root_id != InvalidNodeId()) { | 35 roots_.insert(NodeIdToTransportId(root_id)); |
36 CHECK(GetNode(root_id)); | 36 if (root_id == RootNodeId()) |
37 roots_.insert(NodeIdToTransportId(root_id)); | 37 access_policy_.reset(new WindowManagerAccessPolicy(id_, this)); |
| 38 else |
38 access_policy_.reset(new DefaultAccessPolicy(id_, this)); | 39 access_policy_.reset(new DefaultAccessPolicy(id_, this)); |
39 } else { | |
40 access_policy_.reset(new WindowManagerAccessPolicy(id_, this)); | |
41 } | |
42 } | 40 } |
43 | 41 |
44 ViewManagerServiceImpl::~ViewManagerServiceImpl() { | 42 ViewManagerServiceImpl::~ViewManagerServiceImpl() { |
45 // Delete any views we created. | 43 // Delete any views we created. |
46 while (!view_map_.empty()) { | 44 while (!view_map_.empty()) { |
47 bool result = DeleteViewImpl(this, view_map_.begin()->second); | 45 bool result = DeleteViewImpl(this, view_map_.begin()->second); |
48 DCHECK(result); | 46 DCHECK(result); |
49 } | 47 } |
50 | 48 |
51 // Ditto the nodes. | 49 // Ditto the nodes. |
(...skipping 22 matching lines...) Expand all Loading... |
74 return root_node_manager_->GetView(id); | 72 return root_node_manager_->GetView(id); |
75 } | 73 } |
76 | 74 |
77 bool ViewManagerServiceImpl::HasRoot(const NodeId& id) const { | 75 bool ViewManagerServiceImpl::HasRoot(const NodeId& id) const { |
78 return roots_.find(NodeIdToTransportId(id)) != roots_.end(); | 76 return roots_.find(NodeIdToTransportId(id)) != roots_.end(); |
79 } | 77 } |
80 | 78 |
81 void ViewManagerServiceImpl::OnViewManagerServiceImplDestroyed( | 79 void ViewManagerServiceImpl::OnViewManagerServiceImplDestroyed( |
82 ConnectionSpecificId id) { | 80 ConnectionSpecificId id) { |
83 if (creator_id_ == id) | 81 if (creator_id_ == id) |
84 creator_id_ = kRootConnection; | 82 creator_id_ = kInvalidConnectionId; |
85 } | 83 } |
86 | 84 |
87 void ViewManagerServiceImpl::ProcessNodeBoundsChanged( | 85 void ViewManagerServiceImpl::ProcessNodeBoundsChanged( |
88 const Node* node, | 86 const Node* node, |
89 const gfx::Rect& old_bounds, | 87 const gfx::Rect& old_bounds, |
90 const gfx::Rect& new_bounds, | 88 const gfx::Rect& new_bounds, |
91 bool originated_change) { | 89 bool originated_change) { |
92 if (originated_change || !IsNodeKnown(node)) | 90 if (originated_change || !IsNodeKnown(node)) |
93 return; | 91 return; |
94 client()->OnNodeBoundsChanged(NodeIdToTransportId(node->id()), | 92 client()->OnNodeBoundsChanged(NodeIdToTransportId(node->id()), |
95 Rect::From(old_bounds), | 93 Rect::From(old_bounds), |
96 Rect::From(new_bounds)); | 94 Rect::From(new_bounds)); |
97 } | 95 } |
98 | 96 |
99 void ViewManagerServiceImpl::ProcessNodeHierarchyChanged( | 97 void ViewManagerServiceImpl::ProcessNodeHierarchyChanged( |
100 const Node* node, | 98 const Node* node, |
101 const Node* new_parent, | 99 const Node* new_parent, |
102 const Node* old_parent, | 100 const Node* old_parent, |
103 bool originated_change) { | 101 bool originated_change) { |
| 102 if (originated_change && !IsNodeKnown(node) && new_parent && |
| 103 IsNodeKnown(new_parent)) { |
| 104 std::vector<const Node*> unused; |
| 105 GetUnknownNodesFrom(node, &unused); |
| 106 } |
104 if (originated_change || root_node_manager_->is_processing_delete_node() || | 107 if (originated_change || root_node_manager_->is_processing_delete_node() || |
105 root_node_manager_->DidConnectionMessageClient(id_)) { | 108 root_node_manager_->DidConnectionMessageClient(id_)) { |
106 return; | 109 return; |
107 } | 110 } |
108 | 111 |
109 if (!access_policy_->ShouldNotifyOnHierarchyChange( | 112 if (!access_policy_->ShouldNotifyOnHierarchyChange( |
110 node, &new_parent, &old_parent)) { | 113 node, &new_parent, &old_parent)) { |
111 return; | 114 return; |
112 } | 115 } |
113 // Inform the client of any new nodes and update the set of nodes we know | 116 // Inform the client of any new nodes and update the set of nodes we know |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
151 access_policy_->GetViewIdToSend(node, old_view) : 0; | 154 access_policy_->GetViewIdToSend(node, old_view) : 0; |
152 client()->OnNodeViewReplaced(NodeIdToTransportId(node->id()), | 155 client()->OnNodeViewReplaced(NodeIdToTransportId(node->id()), |
153 new_view_id, old_view_id); | 156 new_view_id, old_view_id); |
154 } | 157 } |
155 | 158 |
156 void ViewManagerServiceImpl::ProcessNodeDeleted(const NodeId& node, | 159 void ViewManagerServiceImpl::ProcessNodeDeleted(const NodeId& node, |
157 bool originated_change) { | 160 bool originated_change) { |
158 node_map_.erase(node.node_id); | 161 node_map_.erase(node.node_id); |
159 | 162 |
160 const bool in_known = known_nodes_.erase(NodeIdToTransportId(node)) > 0; | 163 const bool in_known = known_nodes_.erase(NodeIdToTransportId(node)) > 0; |
161 const bool in_roots = roots_.erase(NodeIdToTransportId(node)) > 0; | 164 roots_.erase(NodeIdToTransportId(node)); |
162 | |
163 // TODO(sky): cleanup! | |
164 if (in_roots && roots_.empty()) | |
165 roots_.insert(NodeIdToTransportId(InvalidNodeId())); | |
166 | 165 |
167 if (originated_change) | 166 if (originated_change) |
168 return; | 167 return; |
169 | 168 |
170 if (in_known) { | 169 if (in_known) { |
171 client()->OnNodeDeleted(NodeIdToTransportId(node)); | 170 client()->OnNodeDeleted(NodeIdToTransportId(node)); |
172 root_node_manager_->OnConnectionMessagedClient(id_); | 171 root_node_manager_->OnConnectionMessagedClient(id_); |
173 } | 172 } |
174 } | 173 } |
175 | 174 |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
259 bool ViewManagerServiceImpl::SetViewImpl(Node* node, View* view) { | 258 bool ViewManagerServiceImpl::SetViewImpl(Node* node, View* view) { |
260 DCHECK(node); // CanSetView() should have verified node exists. | 259 DCHECK(node); // CanSetView() should have verified node exists. |
261 RootNodeManager::ScopedChange change(this, root_node_manager_, false); | 260 RootNodeManager::ScopedChange change(this, root_node_manager_, false); |
262 node->SetView(view); | 261 node->SetView(view); |
263 return true; | 262 return true; |
264 } | 263 } |
265 | 264 |
266 void ViewManagerServiceImpl::GetUnknownNodesFrom( | 265 void ViewManagerServiceImpl::GetUnknownNodesFrom( |
267 const Node* node, | 266 const Node* node, |
268 std::vector<const Node*>* nodes) { | 267 std::vector<const Node*>* nodes) { |
269 if (IsNodeKnown(node)) | 268 if (IsNodeKnown(node) || !access_policy_->CanGetNodeTree(node)) |
270 return; | 269 return; |
271 nodes->push_back(node); | 270 nodes->push_back(node); |
272 known_nodes_.insert(NodeIdToTransportId(node->id())); | 271 known_nodes_.insert(NodeIdToTransportId(node->id())); |
| 272 if (!access_policy_->CanDescendIntoNodeForNodeTree(node)) |
| 273 return; |
273 std::vector<const Node*> children(node->GetChildren()); | 274 std::vector<const Node*> children(node->GetChildren()); |
274 for (size_t i = 0 ; i < children.size(); ++i) | 275 for (size_t i = 0 ; i < children.size(); ++i) |
275 GetUnknownNodesFrom(children[i], nodes); | 276 GetUnknownNodesFrom(children[i], nodes); |
276 } | 277 } |
277 | 278 |
278 void ViewManagerServiceImpl::RemoveFromKnown(const Node* node, | 279 void ViewManagerServiceImpl::RemoveFromKnown(const Node* node, |
279 std::vector<Node*>* local_nodes) { | 280 std::vector<Node*>* local_nodes) { |
280 if (node->id().connection_id == id_) { | 281 if (node->id().connection_id == id_) { |
281 if (local_nodes) | 282 if (local_nodes) |
282 local_nodes->push_back(GetNode(node->id())); | 283 local_nodes->push_back(GetNode(node->id())); |
(...skipping 24 matching lines...) Expand all Loading... |
307 | 308 |
308 client()->OnRootAdded(NodesToNodeDatas(to_send)); | 309 client()->OnRootAdded(NodesToNodeDatas(to_send)); |
309 root_node_manager_->OnConnectionMessagedClient(id_); | 310 root_node_manager_->OnConnectionMessagedClient(id_); |
310 } | 311 } |
311 | 312 |
312 void ViewManagerServiceImpl::RemoveRoot(const NodeId& node_id) { | 313 void ViewManagerServiceImpl::RemoveRoot(const NodeId& node_id) { |
313 const Id transport_node_id(NodeIdToTransportId(node_id)); | 314 const Id transport_node_id(NodeIdToTransportId(node_id)); |
314 CHECK(roots_.count(transport_node_id) > 0); | 315 CHECK(roots_.count(transport_node_id) > 0); |
315 | 316 |
316 roots_.erase(transport_node_id); | 317 roots_.erase(transport_node_id); |
317 if (roots_.empty()) | |
318 roots_.insert(NodeIdToTransportId(InvalidNodeId())); | |
319 | 318 |
320 // No need to do anything if we created the node. | 319 // No need to do anything if we created the node. |
321 if (node_id.connection_id == id_) | 320 if (node_id.connection_id == id_) |
322 return; | 321 return; |
323 | 322 |
324 client()->OnNodeDeleted(transport_node_id); | 323 client()->OnNodeDeleted(transport_node_id); |
325 root_node_manager_->OnConnectionMessagedClient(id_); | 324 root_node_manager_->OnConnectionMessagedClient(id_); |
326 | 325 |
327 // This connection no longer knows about the node. Unparent any nodes that | 326 // This connection no longer knows about the node. Unparent any nodes that |
328 // were parented to nodes in the root. | 327 // were parented to nodes in the root. |
329 std::vector<Node*> local_nodes; | 328 std::vector<Node*> local_nodes; |
330 RemoveFromKnown(GetNode(node_id), &local_nodes); | 329 RemoveFromKnown(GetNode(node_id), &local_nodes); |
331 for (size_t i = 0; i < local_nodes.size(); ++i) | 330 for (size_t i = 0; i < local_nodes.size(); ++i) |
332 local_nodes[i]->GetParent()->Remove(local_nodes[i]); | 331 local_nodes[i]->GetParent()->Remove(local_nodes[i]); |
333 } | 332 } |
334 | 333 |
335 void ViewManagerServiceImpl::RemoveChildrenAsPartOfEmbed( | 334 void ViewManagerServiceImpl::RemoveChildrenAsPartOfEmbed( |
336 const NodeId& node_id) { | 335 const NodeId& node_id) { |
337 // Let the root do what it wants. | |
338 if (roots_.empty()) | |
339 return; | |
340 | |
341 Node* node = GetNode(node_id); | 336 Node* node = GetNode(node_id); |
342 CHECK(node); | 337 CHECK(node); |
343 CHECK(node->id().connection_id == node_id.connection_id); | 338 CHECK(node->id().connection_id == node_id.connection_id); |
344 std::vector<Node*> children = node->GetChildren(); | 339 std::vector<Node*> children = node->GetChildren(); |
345 for (size_t i = 0; i < children.size(); ++i) | 340 for (size_t i = 0; i < children.size(); ++i) |
346 node->Remove(children[i]); | 341 node->Remove(children[i]); |
347 } | 342 } |
348 | 343 |
349 Array<NodeDataPtr> ViewManagerServiceImpl::NodesToNodeDatas( | 344 Array<NodeDataPtr> ViewManagerServiceImpl::NodesToNodeDatas( |
350 const std::vector<const Node*>& nodes) { | 345 const std::vector<const Node*>& nodes) { |
(...skipping 275 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
626 transport_view_id, | 621 transport_view_id, |
627 event.Pass(), | 622 event.Pass(), |
628 base::Bind(&base::DoNothing)); | 623 base::Bind(&base::DoNothing)); |
629 } | 624 } |
630 } | 625 } |
631 | 626 |
632 void ViewManagerServiceImpl::OnConnectionEstablished() { | 627 void ViewManagerServiceImpl::OnConnectionEstablished() { |
633 root_node_manager_->AddConnection(this); | 628 root_node_manager_->AddConnection(this); |
634 | 629 |
635 std::vector<const Node*> to_send; | 630 std::vector<const Node*> to_send; |
636 if (roots_.empty()) { | 631 for (NodeIdSet::const_iterator i = roots_.begin(); i != roots_.end(); ++i) |
637 GetUnknownNodesFrom(root_node_manager_->root(), &to_send); | 632 GetUnknownNodesFrom(GetNode(NodeIdFromTransportId(*i)), &to_send); |
638 } else { | |
639 for (NodeIdSet::const_iterator i = roots_.begin(); i != roots_.end(); ++i) | |
640 GetUnknownNodesFrom(GetNode(NodeIdFromTransportId(*i)), &to_send); | |
641 } | |
642 | 633 |
643 client()->OnViewManagerConnectionEstablished( | 634 client()->OnViewManagerConnectionEstablished( |
644 id_, | 635 id_, |
645 creator_url_, | 636 creator_url_, |
646 NodesToNodeDatas(to_send)); | 637 NodesToNodeDatas(to_send)); |
647 } | 638 } |
648 | 639 |
649 const base::hash_set<Id>& | 640 const base::hash_set<Id>& |
650 ViewManagerServiceImpl::GetRootsForAccessPolicy() const { | 641 ViewManagerServiceImpl::GetRootsForAccessPolicy() const { |
651 return roots_; | 642 return roots_; |
652 } | 643 } |
653 | 644 |
654 bool ViewManagerServiceImpl::IsNodeKnownForAccessPolicy( | 645 bool ViewManagerServiceImpl::IsNodeKnownForAccessPolicy( |
655 const Node* node) const { | 646 const Node* node) const { |
656 return IsNodeKnown(node); | 647 return IsNodeKnown(node); |
657 } | 648 } |
658 | 649 |
659 bool ViewManagerServiceImpl::IsNodeRootOfAnotherConnectionForAccessPolicy( | 650 bool ViewManagerServiceImpl::IsNodeRootOfAnotherConnectionForAccessPolicy( |
660 const Node* node) const { | 651 const Node* node) const { |
661 ViewManagerServiceImpl* connection = | 652 ViewManagerServiceImpl* connection = |
662 root_node_manager_->GetConnectionWithRoot(node->id()); | 653 root_node_manager_->GetConnectionWithRoot(node->id()); |
663 return connection && connection != this; | 654 return connection && connection != this; |
664 } | 655 } |
665 | 656 |
666 } // namespace service | 657 } // namespace service |
667 } // namespace mojo | 658 } // namespace mojo |
OLD | NEW |