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 |