Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(337)

Side by Side Diff: mojo/services/view_manager/view_manager_service_impl.cc

Issue 424533002: Cleans up usage of ViewManagerServiceImpl::roots_ (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fix attempt 2 Created 6 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « mojo/services/view_manager/view_manager_service_impl.h ('k') | mojo/services/view_manager/view_manager_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698