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

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

Issue 294833002: Mojo: more idiomatic C++ bindings (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: serialization Created 6 years, 7 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_connection.h" 5 #include "mojo/services/view_manager/view_manager_connection.h"
6 6
7 #include "base/stl_util.h" 7 #include "base/stl_util.h"
8 #include "mojo/geometry/geometry_type_converters.h" 8 #include "mojo/geometry/geometry_type_converters.h"
9 #include "mojo/public/cpp/bindings/allocation_scope.h"
10 #include "mojo/services/view_manager/node.h" 9 #include "mojo/services/view_manager/node.h"
11 #include "mojo/services/view_manager/root_node_manager.h" 10 #include "mojo/services/view_manager/root_node_manager.h"
12 #include "mojo/services/view_manager/view.h" 11 #include "mojo/services/view_manager/view.h"
13 #include "third_party/skia/include/core/SkBitmap.h" 12 #include "third_party/skia/include/core/SkBitmap.h"
14 #include "ui/aura/window.h" 13 #include "ui/aura/window.h"
15 #include "ui/gfx/codec/png_codec.h" 14 #include "ui/gfx/codec/png_codec.h"
16 15
17 namespace mojo { 16 namespace mojo {
18 namespace view_manager { 17 namespace view_manager {
19 namespace service { 18 namespace service {
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
70 69
71 root_node_manager_->RemoveConnection(this); 70 root_node_manager_->RemoveConnection(this);
72 } 71 }
73 72
74 void ViewManagerConnection::OnConnectionEstablished() { 73 void ViewManagerConnection::OnConnectionEstablished() {
75 DCHECK_EQ(0, id_); // Should only get OnConnectionEstablished() once. 74 DCHECK_EQ(0, id_); // Should only get OnConnectionEstablished() once.
76 id_ = root_node_manager_->GetAndAdvanceNextConnectionId(); 75 id_ = root_node_manager_->GetAndAdvanceNextConnectionId();
77 root_node_manager_->AddConnection(this); 76 root_node_manager_->AddConnection(this);
78 std::vector<const Node*> to_send; 77 std::vector<const Node*> to_send;
79 GetUnknownNodesFrom(root_node_manager_->root(), &to_send); 78 GetUnknownNodesFrom(root_node_manager_->root(), &to_send);
80 AllocationScope allocation_scope;
81 client()->OnConnectionEstablished( 79 client()->OnConnectionEstablished(
82 id_, 80 id_,
83 root_node_manager_->next_server_change_id(), 81 root_node_manager_->next_server_change_id(),
84 NodesToINodes(to_send)); 82 NodesToINodes(to_send));
85 } 83 }
86 84
87 const Node* ViewManagerConnection::GetNode(const NodeId& id) const { 85 const Node* ViewManagerConnection::GetNode(const NodeId& id) const {
88 if (id_ == id.connection_id) { 86 if (id_ == id.connection_id) {
89 NodeMap::const_iterator i = node_map_.find(id.node_id); 87 NodeMap::const_iterator i = node_map_.find(id.node_id);
90 return i == node_map_.end() ? NULL : i->second; 88 return i == node_map_.end() ? NULL : i->second;
(...skipping 11 matching lines...) Expand all
102 100
103 void ViewManagerConnection::ProcessNodeBoundsChanged( 101 void ViewManagerConnection::ProcessNodeBoundsChanged(
104 const Node* node, 102 const Node* node,
105 const gfx::Rect& old_bounds, 103 const gfx::Rect& old_bounds,
106 const gfx::Rect& new_bounds, 104 const gfx::Rect& new_bounds,
107 bool originated_change) { 105 bool originated_change) {
108 if (originated_change) 106 if (originated_change)
109 return; 107 return;
110 TransportNodeId node_id = NodeIdToTransportId(node->id()); 108 TransportNodeId node_id = NodeIdToTransportId(node->id());
111 if (known_nodes_.count(node_id) > 0) { 109 if (known_nodes_.count(node_id) > 0) {
112 AllocationScope scope; 110 client()->OnNodeBoundsChanged(node_id,
113 client()->OnNodeBoundsChanged(node_id, old_bounds, new_bounds); 111 Rect::From(old_bounds),
112 Rect::From(new_bounds));
114 } 113 }
115 } 114 }
116 115
117 void ViewManagerConnection::ProcessNodeHierarchyChanged( 116 void ViewManagerConnection::ProcessNodeHierarchyChanged(
118 const Node* node, 117 const Node* node,
119 const Node* new_parent, 118 const Node* new_parent,
120 const Node* old_parent, 119 const Node* old_parent,
121 TransportChangeId server_change_id, 120 TransportChangeId server_change_id,
122 bool originated_change) { 121 bool originated_change) {
123 if (known_nodes_.count(NodeIdToTransportId(node->id())) > 0) { 122 if (known_nodes_.count(NodeIdToTransportId(node->id())) > 0) {
(...skipping 13 matching lines...) Expand all
137 return; 136 return;
138 std::vector<const Node*> to_send; 137 std::vector<const Node*> to_send;
139 if (!ShouldNotifyOnHierarchyChange(node, &new_parent, &old_parent, 138 if (!ShouldNotifyOnHierarchyChange(node, &new_parent, &old_parent,
140 &to_send)) { 139 &to_send)) {
141 if (root_node_manager_->IsProcessingChange()) { 140 if (root_node_manager_->IsProcessingChange()) {
142 client()->OnServerChangeIdAdvanced( 141 client()->OnServerChangeIdAdvanced(
143 root_node_manager_->next_server_change_id() + 1); 142 root_node_manager_->next_server_change_id() + 1);
144 } 143 }
145 return; 144 return;
146 } 145 }
147 AllocationScope allocation_scope;
148 const NodeId new_parent_id(new_parent ? new_parent->id() : NodeId()); 146 const NodeId new_parent_id(new_parent ? new_parent->id() : NodeId());
149 const NodeId old_parent_id(old_parent ? old_parent->id() : NodeId()); 147 const NodeId old_parent_id(old_parent ? old_parent->id() : NodeId());
150 DCHECK((node->id().connection_id == id_) || 148 DCHECK((node->id().connection_id == id_) ||
151 (roots_.count(NodeIdToTransportId(node->id())) > 0) || 149 (roots_.count(NodeIdToTransportId(node->id())) > 0) ||
152 (new_parent && IsNodeDescendantOfRoots(new_parent)) || 150 (new_parent && IsNodeDescendantOfRoots(new_parent)) ||
153 (old_parent && IsNodeDescendantOfRoots(old_parent))); 151 (old_parent && IsNodeDescendantOfRoots(old_parent)));
154 client()->OnNodeHierarchyChanged(NodeIdToTransportId(node->id()), 152 client()->OnNodeHierarchyChanged(NodeIdToTransportId(node->id()),
155 NodeIdToTransportId(new_parent_id), 153 NodeIdToTransportId(new_parent_id),
156 NodeIdToTransportId(old_parent_id), 154 NodeIdToTransportId(old_parent_id),
157 server_change_id, 155 server_change_id,
(...skipping 258 matching lines...) Expand 10 before | Expand all | Expand 10 after
416 roots.insert(transport_node_ids[i]); 414 roots.insert(transport_node_ids[i]);
417 } 415 }
418 roots_.swap(roots); 416 roots_.swap(roots);
419 417
420 // TODO(sky): remove |known_nodes_.clear()| temporary while this is done here 418 // TODO(sky): remove |known_nodes_.clear()| temporary while this is done here
421 // instead of at creation time. 419 // instead of at creation time.
422 known_nodes_.clear(); 420 known_nodes_.clear();
423 std::vector<const Node*> to_send; 421 std::vector<const Node*> to_send;
424 for (NodeIdSet::const_iterator i = roots_.begin(); i != roots_.end(); ++i) 422 for (NodeIdSet::const_iterator i = roots_.begin(); i != roots_.end(); ++i)
425 GetUnknownNodesFrom(GetNode(NodeIdFromTransportId(*i)), &to_send); 423 GetUnknownNodesFrom(GetNode(NodeIdFromTransportId(*i)), &to_send);
426 AllocationScope allocation_scope;
427 client()->OnConnectionEstablished( 424 client()->OnConnectionEstablished(
428 id_, 425 id_,
429 root_node_manager_->next_server_change_id(), 426 root_node_manager_->next_server_change_id(),
430 NodesToINodes(to_send)); 427 NodesToINodes(to_send));
431 428
432 return true; 429 return true;
433 } 430 }
434 431
435 Array<INode> ViewManagerConnection::NodesToINodes( 432 Array<INodePtr> ViewManagerConnection::NodesToINodes(
436 const std::vector<const Node*>& nodes) { 433 const std::vector<const Node*>& nodes) {
437 Array<INode>::Builder array_builder(nodes.size()); 434 Array<INodePtr> array(nodes.size());
438 for (size_t i = 0; i < nodes.size(); ++i) { 435 for (size_t i = 0; i < nodes.size(); ++i) {
439 INode::Builder node_builder;
440 const Node* node = nodes[i]; 436 const Node* node = nodes[i];
441 DCHECK(known_nodes_.count(NodeIdToTransportId(node->id())) > 0); 437 DCHECK(known_nodes_.count(NodeIdToTransportId(node->id())) > 0);
442 const Node* parent = node->GetParent(); 438 const Node* parent = node->GetParent();
443 // If the parent isn't known, it means the parent is not visible to us (not 439 // If the parent isn't known, it means the parent is not visible to us (not
444 // in roots), and should not be sent over. 440 // in roots), and should not be sent over.
445 if (parent && known_nodes_.count(NodeIdToTransportId(parent->id())) == 0) 441 if (parent && known_nodes_.count(NodeIdToTransportId(parent->id())) == 0)
446 parent = NULL; 442 parent = NULL;
447 node_builder.set_parent_id(NodeIdToTransportId( 443 INodePtr inode(INode::New());
448 parent ? parent->id() : NodeId())); 444 inode->parent_id = NodeIdToTransportId(parent ? parent->id() : NodeId());
449 node_builder.set_node_id(NodeIdToTransportId(node->id())); 445 inode->node_id = NodeIdToTransportId(node->id());
450 node_builder.set_view_id(ViewIdToTransportId( 446 inode->view_id = ViewIdToTransportId(
451 node->view() ? node->view()->id() : ViewId())); 447 node->view() ? node->view()->id() : ViewId());
452 array_builder[i] = node_builder.Finish(); 448 array[i] = inode.Pass();
453 } 449 }
454 return array_builder.Finish(); 450 return array.Pass();
455 } 451 }
456 452
457 void ViewManagerConnection::CreateNode( 453 void ViewManagerConnection::CreateNode(
458 TransportNodeId transport_node_id, 454 TransportNodeId transport_node_id,
459 const Callback<void(bool)>& callback) { 455 const Callback<void(bool)>& callback) {
460 const NodeId node_id(NodeIdFromTransportId(transport_node_id)); 456 const NodeId node_id(NodeIdFromTransportId(transport_node_id));
461 if (node_id.connection_id != id_ || 457 if (node_id.connection_id != id_ ||
462 node_map_.find(node_id.node_id) != node_map_.end()) { 458 node_map_.find(node_id.node_id) != node_map_.end()) {
463 callback.Run(false); 459 callback.Run(false);
464 return; 460 return;
465 } 461 }
466 node_map_[node_id.node_id] = new Node(this, node_id); 462 node_map_[node_id.node_id] = new Node(this, node_id);
467 known_nodes_.insert(transport_node_id); 463 known_nodes_.insert(transport_node_id);
468 callback.Run(true); 464 callback.Run(true);
469 } 465 }
470 466
471 void ViewManagerConnection::DeleteNode( 467 void ViewManagerConnection::DeleteNode(
472 TransportNodeId transport_node_id, 468 TransportNodeId transport_node_id,
473 const Callback<void(bool)>& callback) { 469 const Callback<void(bool)>& callback) {
474 AllocationScope allocation_scope;
475 const NodeId node_id(NodeIdFromTransportId(transport_node_id)); 470 const NodeId node_id(NodeIdFromTransportId(transport_node_id));
476 bool did_delete = CanDeleteNode(node_id); 471 bool did_delete = CanDeleteNode(node_id);
477 if (did_delete) { 472 if (did_delete) {
478 ViewManagerConnection* connection = root_node_manager_->GetConnection( 473 ViewManagerConnection* connection = root_node_manager_->GetConnection(
479 node_id.connection_id); 474 node_id.connection_id);
480 did_delete = connection && connection->DeleteNodeImpl(this, node_id); 475 did_delete = connection && connection->DeleteNodeImpl(this, node_id);
481 } 476 }
482 callback.Run(did_delete); 477 callback.Run(did_delete);
483 } 478 }
484 479
(...skipping 30 matching lines...) Expand all
515 this, root_node_manager_, 510 this, root_node_manager_,
516 RootNodeManager::CHANGE_TYPE_ADVANCE_SERVER_CHANGE_ID, false); 511 RootNodeManager::CHANGE_TYPE_ADVANCE_SERVER_CHANGE_ID, false);
517 node->GetParent()->Remove(node); 512 node->GetParent()->Remove(node);
518 } 513 }
519 } 514 }
520 callback.Run(success); 515 callback.Run(success);
521 } 516 }
522 517
523 void ViewManagerConnection::GetNodeTree( 518 void ViewManagerConnection::GetNodeTree(
524 TransportNodeId node_id, 519 TransportNodeId node_id,
525 const Callback<void(Array<INode>)>& callback) { 520 const Callback<void(Array<INodePtr>)>& callback) {
526 AllocationScope allocation_scope;
527 Node* node = GetNode(NodeIdFromTransportId(node_id)); 521 Node* node = GetNode(NodeIdFromTransportId(node_id));
528 std::vector<const Node*> nodes; 522 std::vector<const Node*> nodes;
529 if (CanGetNodeTree(node)) { 523 if (CanGetNodeTree(node)) {
530 GetDescendants(node, &nodes); 524 GetDescendants(node, &nodes);
531 for (size_t i = 0; i < nodes.size(); ++i) 525 for (size_t i = 0; i < nodes.size(); ++i)
532 known_nodes_.insert(NodeIdToTransportId(nodes[i]->id())); 526 known_nodes_.insert(NodeIdToTransportId(nodes[i]->id()));
533 } 527 }
534 callback.Run(NodesToINodes(nodes)); 528 callback.Run(NodesToINodes(nodes));
535 } 529 }
536 530
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
587 SkBitmap bitmap; 581 SkBitmap bitmap;
588 gfx::PNGCodec::Decode(static_cast<const unsigned char*>(handle_data), 582 gfx::PNGCodec::Decode(static_cast<const unsigned char*>(handle_data),
589 buffer_size, &bitmap); 583 buffer_size, &bitmap);
590 view->SetBitmap(bitmap); 584 view->SetBitmap(bitmap);
591 UnmapBuffer(handle_data); 585 UnmapBuffer(handle_data);
592 callback.Run(true); 586 callback.Run(true);
593 } 587 }
594 588
595 void ViewManagerConnection::SetRoots( 589 void ViewManagerConnection::SetRoots(
596 TransportConnectionId connection_id, 590 TransportConnectionId connection_id,
597 const Array<TransportNodeId>& transport_node_ids, 591 Array<TransportNodeId> transport_node_ids,
598 const Callback<void(bool)>& callback) { 592 const Callback<void(bool)>& callback) {
599 ViewManagerConnection* connection = 593 ViewManagerConnection* connection =
600 root_node_manager_->GetConnection(connection_id); 594 root_node_manager_->GetConnection(connection_id);
601 callback.Run(connection && 595 callback.Run(connection &&
602 connection->ProcessSetRoots(id_, transport_node_ids)); 596 connection->ProcessSetRoots(id_, transport_node_ids));
603 } 597 }
604 598
605 void ViewManagerConnection::SetNodeBounds( 599 void ViewManagerConnection::SetNodeBounds(
606 TransportNodeId node_id, 600 TransportNodeId node_id,
607 const Rect& bounds, 601 RectPtr bounds,
608 const Callback<void(bool)>& callback) { 602 const Callback<void(bool)>& callback) {
609 if (NodeIdFromTransportId(node_id).connection_id != id_) { 603 if (NodeIdFromTransportId(node_id).connection_id != id_) {
610 callback.Run(false); 604 callback.Run(false);
611 return; 605 return;
612 } 606 }
613 607
614 Node* node = GetNode(NodeIdFromTransportId(node_id)); 608 Node* node = GetNode(NodeIdFromTransportId(node_id));
615 if (!node) { 609 if (!node) {
616 callback.Run(false); 610 callback.Run(false);
617 return; 611 return;
618 } 612 }
619 613
620 RootNodeManager::ScopedChange change( 614 RootNodeManager::ScopedChange change(
621 this, root_node_manager_, 615 this, root_node_manager_,
622 RootNodeManager::CHANGE_TYPE_DONT_ADVANCE_SERVER_CHANGE_ID, false); 616 RootNodeManager::CHANGE_TYPE_DONT_ADVANCE_SERVER_CHANGE_ID, false);
623 gfx::Rect old_bounds = node->window()->bounds(); 617 gfx::Rect old_bounds = node->window()->bounds();
624 node->window()->SetBounds(bounds); 618 node->window()->SetBounds(bounds.To<gfx::Rect>());
625 root_node_manager_->ProcessNodeBoundsChanged(node, old_bounds, bounds); 619 root_node_manager_->ProcessNodeBoundsChanged(
620 node, old_bounds, bounds.To<gfx::Rect>());
626 callback.Run(true); 621 callback.Run(true);
627 } 622 }
628 623
629 void ViewManagerConnection::OnNodeHierarchyChanged(const Node* node, 624 void ViewManagerConnection::OnNodeHierarchyChanged(const Node* node,
630 const Node* new_parent, 625 const Node* new_parent,
631 const Node* old_parent) { 626 const Node* old_parent) {
632 root_node_manager_->ProcessNodeHierarchyChanged(node, new_parent, old_parent); 627 root_node_manager_->ProcessNodeHierarchyChanged(node, new_parent, old_parent);
633 } 628 }
634 629
635 void ViewManagerConnection::OnNodeViewReplaced(const Node* node, 630 void ViewManagerConnection::OnNodeViewReplaced(const Node* node,
636 const View* new_view, 631 const View* new_view,
637 const View* old_view) { 632 const View* old_view) {
638 root_node_manager_->ProcessNodeViewReplaced(node, new_view, old_view); 633 root_node_manager_->ProcessNodeViewReplaced(node, new_view, old_view);
639 } 634 }
640 635
641 } // namespace service 636 } // namespace service
642 } // namespace view_manager 637 } // namespace view_manager
643 } // namespace mojo 638 } // namespace mojo
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698