| 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_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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |