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

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: rebase Created 6 years, 6 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/public/cpp/bindings/allocation_scope.h"
9 #include "mojo/services/public/cpp/geometry/geometry_type_converters.h" 8 #include "mojo/services/public/cpp/geometry/geometry_type_converters.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 {
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
99 98
100 void ViewManagerConnection::ProcessNodeBoundsChanged( 99 void ViewManagerConnection::ProcessNodeBoundsChanged(
101 const Node* node, 100 const Node* node,
102 const gfx::Rect& old_bounds, 101 const gfx::Rect& old_bounds,
103 const gfx::Rect& new_bounds, 102 const gfx::Rect& new_bounds,
104 bool originated_change) { 103 bool originated_change) {
105 if (originated_change) 104 if (originated_change)
106 return; 105 return;
107 TransportNodeId node_id = NodeIdToTransportId(node->id()); 106 TransportNodeId node_id = NodeIdToTransportId(node->id());
108 if (known_nodes_.count(node_id) > 0) { 107 if (known_nodes_.count(node_id) > 0) {
109 AllocationScope scope; 108 client()->OnNodeBoundsChanged(node_id,
110 client()->OnNodeBoundsChanged(node_id, old_bounds, new_bounds); 109 Rect::From(old_bounds),
110 Rect::From(new_bounds));
111 } 111 }
112 } 112 }
113 113
114 void ViewManagerConnection::ProcessNodeHierarchyChanged( 114 void ViewManagerConnection::ProcessNodeHierarchyChanged(
115 const Node* node, 115 const Node* node,
116 const Node* new_parent, 116 const Node* new_parent,
117 const Node* old_parent, 117 const Node* old_parent,
118 TransportChangeId server_change_id, 118 TransportChangeId server_change_id,
119 bool originated_change) { 119 bool originated_change) {
120 if (known_nodes_.count(NodeIdToTransportId(node->id())) > 0) { 120 if (known_nodes_.count(NodeIdToTransportId(node->id())) > 0) {
(...skipping 13 matching lines...) Expand all
134 return; 134 return;
135 std::vector<const Node*> to_send; 135 std::vector<const Node*> to_send;
136 if (!ShouldNotifyOnHierarchyChange(node, &new_parent, &old_parent, 136 if (!ShouldNotifyOnHierarchyChange(node, &new_parent, &old_parent,
137 &to_send)) { 137 &to_send)) {
138 if (root_node_manager_->IsProcessingChange()) { 138 if (root_node_manager_->IsProcessingChange()) {
139 client()->OnServerChangeIdAdvanced( 139 client()->OnServerChangeIdAdvanced(
140 root_node_manager_->next_server_change_id() + 1); 140 root_node_manager_->next_server_change_id() + 1);
141 } 141 }
142 return; 142 return;
143 } 143 }
144 AllocationScope allocation_scope;
145 const NodeId new_parent_id(new_parent ? new_parent->id() : NodeId()); 144 const NodeId new_parent_id(new_parent ? new_parent->id() : NodeId());
146 const NodeId old_parent_id(old_parent ? old_parent->id() : NodeId()); 145 const NodeId old_parent_id(old_parent ? old_parent->id() : NodeId());
147 DCHECK((node->id().connection_id == id_) || 146 DCHECK((node->id().connection_id == id_) ||
148 (roots_.count(NodeIdToTransportId(node->id())) > 0) || 147 (roots_.count(NodeIdToTransportId(node->id())) > 0) ||
149 (new_parent && IsNodeDescendantOfRoots(new_parent)) || 148 (new_parent && IsNodeDescendantOfRoots(new_parent)) ||
150 (old_parent && IsNodeDescendantOfRoots(old_parent))); 149 (old_parent && IsNodeDescendantOfRoots(old_parent)));
151 client()->OnNodeHierarchyChanged(NodeIdToTransportId(node->id()), 150 client()->OnNodeHierarchyChanged(NodeIdToTransportId(node->id()),
152 NodeIdToTransportId(new_parent_id), 151 NodeIdToTransportId(new_parent_id),
153 NodeIdToTransportId(old_parent_id), 152 NodeIdToTransportId(old_parent_id),
154 server_change_id, 153 server_change_id,
(...skipping 248 matching lines...) Expand 10 before | Expand all | Expand 10 after
403 // |roots_|. 402 // |roots_|.
404 GetUnknownNodesFrom((*new_parent)->GetRoot(), to_send); 403 GetUnknownNodesFrom((*new_parent)->GetRoot(), to_send);
405 return true; 404 return true;
406 } 405 }
407 } 406 }
408 // Otherwise only communicate the change if the node was known. We shouldn't 407 // Otherwise only communicate the change if the node was known. We shouldn't
409 // need to communicate any nodes on a remove. 408 // need to communicate any nodes on a remove.
410 return known_nodes_.count(NodeIdToTransportId(node->id())) > 0; 409 return known_nodes_.count(NodeIdToTransportId(node->id())) > 0;
411 } 410 }
412 411
413 Array<INode> ViewManagerConnection::NodesToINodes( 412 Array<INodePtr> ViewManagerConnection::NodesToINodes(
414 const std::vector<const Node*>& nodes) { 413 const std::vector<const Node*>& nodes) {
415 Array<INode>::Builder array_builder(nodes.size()); 414 Array<INodePtr> array(nodes.size());
416 for (size_t i = 0; i < nodes.size(); ++i) { 415 for (size_t i = 0; i < nodes.size(); ++i) {
417 INode::Builder node_builder;
418 const Node* node = nodes[i]; 416 const Node* node = nodes[i];
419 DCHECK(known_nodes_.count(NodeIdToTransportId(node->id())) > 0); 417 DCHECK(known_nodes_.count(NodeIdToTransportId(node->id())) > 0);
420 const Node* parent = node->GetParent(); 418 const Node* parent = node->GetParent();
421 // If the parent isn't known, it means the parent is not visible to us (not 419 // If the parent isn't known, it means the parent is not visible to us (not
422 // in roots), and should not be sent over. 420 // in roots), and should not be sent over.
423 if (parent && known_nodes_.count(NodeIdToTransportId(parent->id())) == 0) 421 if (parent && known_nodes_.count(NodeIdToTransportId(parent->id())) == 0)
424 parent = NULL; 422 parent = NULL;
425 node_builder.set_parent_id(NodeIdToTransportId( 423 INodePtr inode(INode::New());
426 parent ? parent->id() : NodeId())); 424 inode->parent_id = NodeIdToTransportId(parent ? parent->id() : NodeId());
427 node_builder.set_node_id(NodeIdToTransportId(node->id())); 425 inode->node_id = NodeIdToTransportId(node->id());
428 node_builder.set_view_id(ViewIdToTransportId( 426 inode->view_id =
429 node->view() ? node->view()->id() : ViewId())); 427 ViewIdToTransportId(node->view() ? node->view()->id() : ViewId());
430 node_builder.set_bounds(node->bounds()); 428 inode->bounds = Rect::From(node->bounds());
431 array_builder[i] = node_builder.Finish(); 429 array[i] = inode.Pass();
432 } 430 }
433 return array_builder.Finish(); 431 return array.Pass();
434 } 432 }
435 433
436 void ViewManagerConnection::CreateNode( 434 void ViewManagerConnection::CreateNode(
437 TransportNodeId transport_node_id, 435 TransportNodeId transport_node_id,
438 const Callback<void(bool)>& callback) { 436 const Callback<void(bool)>& callback) {
439 const NodeId node_id(NodeIdFromTransportId(transport_node_id)); 437 const NodeId node_id(NodeIdFromTransportId(transport_node_id));
440 if (node_id.connection_id != id_ || 438 if (node_id.connection_id != id_ ||
441 node_map_.find(node_id.node_id) != node_map_.end()) { 439 node_map_.find(node_id.node_id) != node_map_.end()) {
442 callback.Run(false); 440 callback.Run(false);
443 return; 441 return;
444 } 442 }
445 node_map_[node_id.node_id] = new Node(this, node_id); 443 node_map_[node_id.node_id] = new Node(this, node_id);
446 known_nodes_.insert(transport_node_id); 444 known_nodes_.insert(transport_node_id);
447 callback.Run(true); 445 callback.Run(true);
448 } 446 }
449 447
450 void ViewManagerConnection::DeleteNode( 448 void ViewManagerConnection::DeleteNode(
451 TransportNodeId transport_node_id, 449 TransportNodeId transport_node_id,
452 const Callback<void(bool)>& callback) { 450 const Callback<void(bool)>& callback) {
453 AllocationScope allocation_scope;
454 const NodeId node_id(NodeIdFromTransportId(transport_node_id)); 451 const NodeId node_id(NodeIdFromTransportId(transport_node_id));
455 bool did_delete = CanDeleteNode(node_id); 452 bool did_delete = CanDeleteNode(node_id);
456 if (did_delete) { 453 if (did_delete) {
457 ViewManagerConnection* connection = root_node_manager_->GetConnection( 454 ViewManagerConnection* connection = root_node_manager_->GetConnection(
458 node_id.connection_id); 455 node_id.connection_id);
459 did_delete = connection && connection->DeleteNodeImpl(this, node_id); 456 did_delete = connection && connection->DeleteNodeImpl(this, node_id);
460 } 457 }
461 callback.Run(did_delete); 458 callback.Run(did_delete);
462 } 459 }
463 460
(...skipping 30 matching lines...) Expand all
494 this, root_node_manager_, 491 this, root_node_manager_,
495 RootNodeManager::CHANGE_TYPE_ADVANCE_SERVER_CHANGE_ID, false); 492 RootNodeManager::CHANGE_TYPE_ADVANCE_SERVER_CHANGE_ID, false);
496 node->GetParent()->Remove(node); 493 node->GetParent()->Remove(node);
497 } 494 }
498 } 495 }
499 callback.Run(success); 496 callback.Run(success);
500 } 497 }
501 498
502 void ViewManagerConnection::GetNodeTree( 499 void ViewManagerConnection::GetNodeTree(
503 TransportNodeId node_id, 500 TransportNodeId node_id,
504 const Callback<void(Array<INode>)>& callback) { 501 const Callback<void(Array<INodePtr>)>& callback) {
505 AllocationScope allocation_scope;
506 Node* node = GetNode(NodeIdFromTransportId(node_id)); 502 Node* node = GetNode(NodeIdFromTransportId(node_id));
507 std::vector<const Node*> nodes; 503 std::vector<const Node*> nodes;
508 if (CanGetNodeTree(node)) { 504 if (CanGetNodeTree(node)) {
509 GetDescendants(node, &nodes); 505 GetDescendants(node, &nodes);
510 for (size_t i = 0; i < nodes.size(); ++i) 506 for (size_t i = 0; i < nodes.size(); ++i)
511 known_nodes_.insert(NodeIdToTransportId(nodes[i]->id())); 507 known_nodes_.insert(NodeIdToTransportId(nodes[i]->id()));
512 } 508 }
513 callback.Run(NodesToINodes(nodes)); 509 callback.Run(NodesToINodes(nodes));
514 } 510 }
515 511
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
566 SkBitmap bitmap; 562 SkBitmap bitmap;
567 gfx::PNGCodec::Decode(static_cast<const unsigned char*>(handle_data), 563 gfx::PNGCodec::Decode(static_cast<const unsigned char*>(handle_data),
568 buffer_size, &bitmap); 564 buffer_size, &bitmap);
569 view->SetBitmap(bitmap); 565 view->SetBitmap(bitmap);
570 UnmapBuffer(handle_data); 566 UnmapBuffer(handle_data);
571 callback.Run(true); 567 callback.Run(true);
572 } 568 }
573 569
574 void ViewManagerConnection::SetNodeBounds( 570 void ViewManagerConnection::SetNodeBounds(
575 TransportNodeId node_id, 571 TransportNodeId node_id,
576 const Rect& bounds, 572 RectPtr bounds,
577 const Callback<void(bool)>& callback) { 573 const Callback<void(bool)>& callback) {
578 if (NodeIdFromTransportId(node_id).connection_id != id_) { 574 if (NodeIdFromTransportId(node_id).connection_id != id_) {
579 callback.Run(false); 575 callback.Run(false);
580 return; 576 return;
581 } 577 }
582 578
583 Node* node = GetNode(NodeIdFromTransportId(node_id)); 579 Node* node = GetNode(NodeIdFromTransportId(node_id));
584 if (!node) { 580 if (!node) {
585 callback.Run(false); 581 callback.Run(false);
586 return; 582 return;
587 } 583 }
588 584
589 RootNodeManager::ScopedChange change( 585 RootNodeManager::ScopedChange change(
590 this, root_node_manager_, 586 this, root_node_manager_,
591 RootNodeManager::CHANGE_TYPE_DONT_ADVANCE_SERVER_CHANGE_ID, false); 587 RootNodeManager::CHANGE_TYPE_DONT_ADVANCE_SERVER_CHANGE_ID, false);
592 gfx::Rect old_bounds = node->window()->bounds(); 588 gfx::Rect old_bounds = node->window()->bounds();
593 node->window()->SetBounds(bounds); 589 node->window()->SetBounds(bounds.To<gfx::Rect>());
594 root_node_manager_->ProcessNodeBoundsChanged(node, old_bounds, bounds); 590 root_node_manager_->ProcessNodeBoundsChanged(
591 node, old_bounds, bounds.To<gfx::Rect>());
595 callback.Run(true); 592 callback.Run(true);
596 } 593 }
597 594
598 void ViewManagerConnection::Connect(const String& url, 595 void ViewManagerConnection::Connect(const String& url,
599 const Array<uint32_t>& node_ids, 596 Array<uint32_t> node_ids,
600 const Callback<void(bool)>& callback) { 597 const Callback<void(bool)>& callback) {
601 const bool success = CanConnect(node_ids); 598 const bool success = CanConnect(node_ids);
602 if (success) 599 if (success)
603 root_node_manager_->Connect(url, node_ids); 600 root_node_manager_->Connect(url, node_ids);
604 callback.Run(success); 601 callback.Run(success);
605 } 602 }
606 603
607 void ViewManagerConnection::OnNodeHierarchyChanged(const Node* node, 604 void ViewManagerConnection::OnNodeHierarchyChanged(const Node* node,
608 const Node* new_parent, 605 const Node* new_parent,
609 const Node* old_parent) { 606 const Node* old_parent) {
(...skipping 14 matching lines...) Expand all
624 root_node_manager_->AddConnection(this); 621 root_node_manager_->AddConnection(this);
625 622
626 std::vector<const Node*> to_send; 623 std::vector<const Node*> to_send;
627 if (roots_.empty()) { 624 if (roots_.empty()) {
628 GetUnknownNodesFrom(root_node_manager_->root(), &to_send); 625 GetUnknownNodesFrom(root_node_manager_->root(), &to_send);
629 } else { 626 } else {
630 for (NodeIdSet::const_iterator i = roots_.begin(); i != roots_.end(); ++i) 627 for (NodeIdSet::const_iterator i = roots_.begin(); i != roots_.end(); ++i)
631 GetUnknownNodesFrom(GetNode(NodeIdFromTransportId(*i)), &to_send); 628 GetUnknownNodesFrom(GetNode(NodeIdFromTransportId(*i)), &to_send);
632 } 629 }
633 630
634 AllocationScope allocation_scope;
635 client()->OnViewManagerConnectionEstablished( 631 client()->OnViewManagerConnectionEstablished(
636 id_, 632 id_,
637 root_node_manager_->next_server_change_id(), 633 root_node_manager_->next_server_change_id(),
638 NodesToINodes(to_send)); 634 NodesToINodes(to_send));
639 } 635 }
640 636
641 } // namespace service 637 } // namespace service
642 } // namespace view_manager 638 } // namespace view_manager
643 } // namespace mojo 639 } // namespace mojo
OLDNEW
« no previous file with comments | « mojo/services/view_manager/view_manager_connection.h ('k') | mojo/services/view_manager/view_manager_connection_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698