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