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