| 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_service_impl.h" | 5 #include "mojo/services/view_manager/view_manager_service_impl.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "mojo/services/public/cpp/geometry/geometry_type_converters.h" | 8 #include "mojo/services/public/cpp/geometry/geometry_type_converters.h" |
| 9 #include "mojo/services/public/cpp/input_events/input_events_type_converters.h" | 9 #include "mojo/services/public/cpp/input_events/input_events_type_converters.h" |
| 10 #include "mojo/services/view_manager/default_access_policy.h" | 10 #include "mojo/services/view_manager/default_access_policy.h" |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 69 creator_id_ = kInvalidConnectionId; | 69 creator_id_ = kInvalidConnectionId; |
| 70 } | 70 } |
| 71 | 71 |
| 72 void ViewManagerServiceImpl::ProcessNodeBoundsChanged( | 72 void ViewManagerServiceImpl::ProcessNodeBoundsChanged( |
| 73 const Node* node, | 73 const Node* node, |
| 74 const gfx::Rect& old_bounds, | 74 const gfx::Rect& old_bounds, |
| 75 const gfx::Rect& new_bounds, | 75 const gfx::Rect& new_bounds, |
| 76 bool originated_change) { | 76 bool originated_change) { |
| 77 if (originated_change || !IsNodeKnown(node)) | 77 if (originated_change || !IsNodeKnown(node)) |
| 78 return; | 78 return; |
| 79 client()->OnNodeBoundsChanged(NodeIdToTransportId(node->id()), | 79 client()->OnViewBoundsChanged(NodeIdToTransportId(node->id()), |
| 80 Rect::From(old_bounds), | 80 Rect::From(old_bounds), |
| 81 Rect::From(new_bounds)); | 81 Rect::From(new_bounds)); |
| 82 } | 82 } |
| 83 | 83 |
| 84 void ViewManagerServiceImpl::ProcessNodeHierarchyChanged( | 84 void ViewManagerServiceImpl::ProcessNodeHierarchyChanged( |
| 85 const Node* node, | 85 const Node* node, |
| 86 const Node* new_parent, | 86 const Node* new_parent, |
| 87 const Node* old_parent, | 87 const Node* old_parent, |
| 88 bool originated_change) { | 88 bool originated_change) { |
| 89 if (originated_change && !IsNodeKnown(node) && new_parent && | 89 if (originated_change && !IsNodeKnown(node) && new_parent && |
| (...skipping 10 matching lines...) Expand all Loading... |
| 100 node, &new_parent, &old_parent)) { | 100 node, &new_parent, &old_parent)) { |
| 101 return; | 101 return; |
| 102 } | 102 } |
| 103 // Inform the client of any new nodes and update the set of nodes we know | 103 // Inform the client of any new nodes and update the set of nodes we know |
| 104 // about. | 104 // about. |
| 105 std::vector<const Node*> to_send; | 105 std::vector<const Node*> to_send; |
| 106 if (!IsNodeKnown(node)) | 106 if (!IsNodeKnown(node)) |
| 107 GetUnknownNodesFrom(node, &to_send); | 107 GetUnknownNodesFrom(node, &to_send); |
| 108 const NodeId new_parent_id(new_parent ? new_parent->id() : NodeId()); | 108 const NodeId new_parent_id(new_parent ? new_parent->id() : NodeId()); |
| 109 const NodeId old_parent_id(old_parent ? old_parent->id() : NodeId()); | 109 const NodeId old_parent_id(old_parent ? old_parent->id() : NodeId()); |
| 110 client()->OnNodeHierarchyChanged(NodeIdToTransportId(node->id()), | 110 client()->OnViewHierarchyChanged(NodeIdToTransportId(node->id()), |
| 111 NodeIdToTransportId(new_parent_id), | 111 NodeIdToTransportId(new_parent_id), |
| 112 NodeIdToTransportId(old_parent_id), | 112 NodeIdToTransportId(old_parent_id), |
| 113 NodesToNodeDatas(to_send)); | 113 NodesToViewDatas(to_send)); |
| 114 root_node_manager_->OnConnectionMessagedClient(id_); | 114 root_node_manager_->OnConnectionMessagedClient(id_); |
| 115 } | 115 } |
| 116 | 116 |
| 117 void ViewManagerServiceImpl::ProcessNodeReorder(const Node* node, | 117 void ViewManagerServiceImpl::ProcessNodeReorder(const Node* node, |
| 118 const Node* relative_node, | 118 const Node* relative_node, |
| 119 OrderDirection direction, | 119 OrderDirection direction, |
| 120 bool originated_change) { | 120 bool originated_change) { |
| 121 if (originated_change || !IsNodeKnown(node) || !IsNodeKnown(relative_node)) | 121 if (originated_change || !IsNodeKnown(node) || !IsNodeKnown(relative_node)) |
| 122 return; | 122 return; |
| 123 | 123 |
| 124 client()->OnNodeReordered(NodeIdToTransportId(node->id()), | 124 client()->OnViewReordered(NodeIdToTransportId(node->id()), |
| 125 NodeIdToTransportId(relative_node->id()), | 125 NodeIdToTransportId(relative_node->id()), |
| 126 direction); | 126 direction); |
| 127 } | 127 } |
| 128 | 128 |
| 129 void ViewManagerServiceImpl::ProcessNodeDeleted(const NodeId& node, | 129 void ViewManagerServiceImpl::ProcessNodeDeleted(const NodeId& node, |
| 130 bool originated_change) { | 130 bool originated_change) { |
| 131 node_map_.erase(node.node_id); | 131 node_map_.erase(node.node_id); |
| 132 | 132 |
| 133 const bool in_known = known_nodes_.erase(NodeIdToTransportId(node)) > 0; | 133 const bool in_known = known_nodes_.erase(NodeIdToTransportId(node)) > 0; |
| 134 roots_.erase(NodeIdToTransportId(node)); | 134 roots_.erase(NodeIdToTransportId(node)); |
| 135 | 135 |
| 136 if (originated_change) | 136 if (originated_change) |
| 137 return; | 137 return; |
| 138 | 138 |
| 139 if (in_known) { | 139 if (in_known) { |
| 140 client()->OnNodeDeleted(NodeIdToTransportId(node)); | 140 client()->OnViewDeleted(NodeIdToTransportId(node)); |
| 141 root_node_manager_->OnConnectionMessagedClient(id_); | 141 root_node_manager_->OnConnectionMessagedClient(id_); |
| 142 } | 142 } |
| 143 } | 143 } |
| 144 | 144 |
| 145 void ViewManagerServiceImpl::ProcessFocusChanged(const Node* focused_node, | 145 void ViewManagerServiceImpl::ProcessFocusChanged(const Node* focused_node, |
| 146 const Node* blurred_node, | 146 const Node* blurred_node, |
| 147 bool originated_change) { | 147 bool originated_change) { |
| 148 if (originated_change) | 148 if (originated_change) |
| 149 return; | 149 return; |
| 150 | 150 |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 244 CHECK(node); | 244 CHECK(node); |
| 245 std::vector<const Node*> to_send; | 245 std::vector<const Node*> to_send; |
| 246 if (!IsNodeKnown(node)) { | 246 if (!IsNodeKnown(node)) { |
| 247 GetUnknownNodesFrom(node, &to_send); | 247 GetUnknownNodesFrom(node, &to_send); |
| 248 } else { | 248 } else { |
| 249 // Even though the connection knows about the new root we need to tell it | 249 // Even though the connection knows about the new root we need to tell it |
| 250 // |node| is now a root. | 250 // |node| is now a root. |
| 251 to_send.push_back(node); | 251 to_send.push_back(node); |
| 252 } | 252 } |
| 253 | 253 |
| 254 client()->OnEmbed(id_, creator_url_, NodeToNodeData(to_send.front()), | 254 client()->OnEmbed(id_, creator_url_, NodeToViewData(to_send.front()), |
| 255 service_provider.Pass()); | 255 service_provider.Pass()); |
| 256 root_node_manager_->OnConnectionMessagedClient(id_); | 256 root_node_manager_->OnConnectionMessagedClient(id_); |
| 257 } | 257 } |
| 258 | 258 |
| 259 void ViewManagerServiceImpl::RemoveRoot(const NodeId& node_id) { | 259 void ViewManagerServiceImpl::RemoveRoot(const NodeId& node_id) { |
| 260 const Id transport_node_id(NodeIdToTransportId(node_id)); | 260 const Id transport_node_id(NodeIdToTransportId(node_id)); |
| 261 CHECK(roots_.count(transport_node_id) > 0); | 261 CHECK(roots_.count(transport_node_id) > 0); |
| 262 | 262 |
| 263 roots_.erase(transport_node_id); | 263 roots_.erase(transport_node_id); |
| 264 | 264 |
| 265 // No need to do anything if we created the node. | 265 // No need to do anything if we created the node. |
| 266 if (node_id.connection_id == id_) | 266 if (node_id.connection_id == id_) |
| 267 return; | 267 return; |
| 268 | 268 |
| 269 client()->OnNodeDeleted(transport_node_id); | 269 client()->OnViewDeleted(transport_node_id); |
| 270 root_node_manager_->OnConnectionMessagedClient(id_); | 270 root_node_manager_->OnConnectionMessagedClient(id_); |
| 271 | 271 |
| 272 // This connection no longer knows about the node. Unparent any nodes that | 272 // This connection no longer knows about the node. Unparent any nodes that |
| 273 // were parented to nodes in the root. | 273 // were parented to nodes in the root. |
| 274 std::vector<Node*> local_nodes; | 274 std::vector<Node*> local_nodes; |
| 275 RemoveFromKnown(GetNode(node_id), &local_nodes); | 275 RemoveFromKnown(GetNode(node_id), &local_nodes); |
| 276 for (size_t i = 0; i < local_nodes.size(); ++i) | 276 for (size_t i = 0; i < local_nodes.size(); ++i) |
| 277 local_nodes[i]->GetParent()->Remove(local_nodes[i]); | 277 local_nodes[i]->GetParent()->Remove(local_nodes[i]); |
| 278 } | 278 } |
| 279 | 279 |
| 280 void ViewManagerServiceImpl::RemoveChildrenAsPartOfEmbed( | 280 void ViewManagerServiceImpl::RemoveChildrenAsPartOfEmbed( |
| 281 const NodeId& node_id) { | 281 const NodeId& node_id) { |
| 282 Node* node = GetNode(node_id); | 282 Node* node = GetNode(node_id); |
| 283 CHECK(node); | 283 CHECK(node); |
| 284 CHECK(node->id().connection_id == node_id.connection_id); | 284 CHECK(node->id().connection_id == node_id.connection_id); |
| 285 std::vector<Node*> children = node->GetChildren(); | 285 std::vector<Node*> children = node->GetChildren(); |
| 286 for (size_t i = 0; i < children.size(); ++i) | 286 for (size_t i = 0; i < children.size(); ++i) |
| 287 node->Remove(children[i]); | 287 node->Remove(children[i]); |
| 288 } | 288 } |
| 289 | 289 |
| 290 Array<NodeDataPtr> ViewManagerServiceImpl::NodesToNodeDatas( | 290 Array<ViewDataPtr> ViewManagerServiceImpl::NodesToViewDatas( |
| 291 const std::vector<const Node*>& nodes) { | 291 const std::vector<const Node*>& nodes) { |
| 292 Array<NodeDataPtr> array(nodes.size()); | 292 Array<ViewDataPtr> array(nodes.size()); |
| 293 for (size_t i = 0; i < nodes.size(); ++i) | 293 for (size_t i = 0; i < nodes.size(); ++i) |
| 294 array[i] = NodeToNodeData(nodes[i]).Pass(); | 294 array[i] = NodeToViewData(nodes[i]).Pass(); |
| 295 return array.Pass(); | 295 return array.Pass(); |
| 296 } | 296 } |
| 297 | 297 |
| 298 NodeDataPtr ViewManagerServiceImpl::NodeToNodeData(const Node* node) { | 298 ViewDataPtr ViewManagerServiceImpl::NodeToViewData(const Node* node) { |
| 299 DCHECK(IsNodeKnown(node)); | 299 DCHECK(IsNodeKnown(node)); |
| 300 const Node* parent = node->GetParent(); | 300 const Node* parent = node->GetParent(); |
| 301 // If the parent isn't known, it means the parent is not visible to us (not | 301 // If the parent isn't known, it means the parent is not visible to us (not |
| 302 // in roots), and should not be sent over. | 302 // in roots), and should not be sent over. |
| 303 if (parent && !IsNodeKnown(parent)) | 303 if (parent && !IsNodeKnown(parent)) |
| 304 parent = NULL; | 304 parent = NULL; |
| 305 NodeDataPtr node_data(NodeData::New()); | 305 ViewDataPtr view_data(ViewData::New()); |
| 306 node_data->parent_id = NodeIdToTransportId(parent ? parent->id() : NodeId()); | 306 view_data->parent_id = NodeIdToTransportId(parent ? parent->id() : NodeId()); |
| 307 node_data->node_id = NodeIdToTransportId(node->id()); | 307 view_data->view_id = NodeIdToTransportId(node->id()); |
| 308 node_data->bounds = Rect::From(node->bounds()); | 308 view_data->bounds = Rect::From(node->bounds()); |
| 309 return node_data.Pass(); | 309 return view_data.Pass(); |
| 310 } | 310 } |
| 311 | 311 |
| 312 void ViewManagerServiceImpl::GetNodeTreeImpl( | 312 void ViewManagerServiceImpl::GetNodeTreeImpl( |
| 313 const Node* node, | 313 const Node* node, |
| 314 std::vector<const Node*>* nodes) const { | 314 std::vector<const Node*>* nodes) const { |
| 315 DCHECK(node); | 315 DCHECK(node); |
| 316 | 316 |
| 317 if (!access_policy_->CanGetNodeTree(node)) | 317 if (!access_policy_->CanGetNodeTree(node)) |
| 318 return; | 318 return; |
| 319 | 319 |
| 320 nodes->push_back(node); | 320 nodes->push_back(node); |
| 321 | 321 |
| 322 if (!access_policy_->CanDescendIntoNodeForNodeTree(node)) | 322 if (!access_policy_->CanDescendIntoNodeForNodeTree(node)) |
| 323 return; | 323 return; |
| 324 | 324 |
| 325 std::vector<const Node*> children(node->GetChildren()); | 325 std::vector<const Node*> children(node->GetChildren()); |
| 326 for (size_t i = 0 ; i < children.size(); ++i) | 326 for (size_t i = 0 ; i < children.size(); ++i) |
| 327 GetNodeTreeImpl(children[i], nodes); | 327 GetNodeTreeImpl(children[i], nodes); |
| 328 } | 328 } |
| 329 | 329 |
| 330 void ViewManagerServiceImpl::CreateNode( | 330 void ViewManagerServiceImpl::CreateView( |
| 331 Id transport_node_id, | 331 Id transport_view_id, |
| 332 const Callback<void(ErrorCode)>& callback) { | 332 const Callback<void(ErrorCode)>& callback) { |
| 333 const NodeId node_id(NodeIdFromTransportId(transport_node_id)); | 333 const NodeId node_id(NodeIdFromTransportId(transport_view_id)); |
| 334 ErrorCode error_code = ERROR_CODE_NONE; | 334 ErrorCode error_code = ERROR_CODE_NONE; |
| 335 if (node_id.connection_id != id_) { | 335 if (node_id.connection_id != id_) { |
| 336 error_code = ERROR_CODE_ILLEGAL_ARGUMENT; | 336 error_code = ERROR_CODE_ILLEGAL_ARGUMENT; |
| 337 } else if (node_map_.find(node_id.node_id) != node_map_.end()) { | 337 } else if (node_map_.find(node_id.node_id) != node_map_.end()) { |
| 338 error_code = ERROR_CODE_VALUE_IN_USE; | 338 error_code = ERROR_CODE_VALUE_IN_USE; |
| 339 } else { | 339 } else { |
| 340 node_map_[node_id.node_id] = new Node(root_node_manager_, node_id); | 340 node_map_[node_id.node_id] = new Node(root_node_manager_, node_id); |
| 341 known_nodes_.insert(transport_node_id); | 341 known_nodes_.insert(transport_view_id); |
| 342 } | 342 } |
| 343 callback.Run(error_code); | 343 callback.Run(error_code); |
| 344 } | 344 } |
| 345 | 345 |
| 346 void ViewManagerServiceImpl::DeleteNode( | 346 void ViewManagerServiceImpl::DeleteView( |
| 347 Id transport_node_id, | 347 Id transport_view_id, |
| 348 const Callback<void(bool)>& callback) { | 348 const Callback<void(bool)>& callback) { |
| 349 Node* node = GetNode(NodeIdFromTransportId(transport_node_id)); | 349 Node* node = GetNode(NodeIdFromTransportId(transport_view_id)); |
| 350 bool success = false; | 350 bool success = false; |
| 351 if (node && access_policy_->CanDeleteNode(node)) { | 351 if (node && access_policy_->CanDeleteNode(node)) { |
| 352 ViewManagerServiceImpl* connection = root_node_manager_->GetConnection( | 352 ViewManagerServiceImpl* connection = root_node_manager_->GetConnection( |
| 353 node->id().connection_id); | 353 node->id().connection_id); |
| 354 success = connection && connection->DeleteNodeImpl(this, node); | 354 success = connection && connection->DeleteNodeImpl(this, node); |
| 355 } | 355 } |
| 356 callback.Run(success); | 356 callback.Run(success); |
| 357 } | 357 } |
| 358 | 358 |
| 359 void ViewManagerServiceImpl::AddNode( | 359 void ViewManagerServiceImpl::AddView( |
| 360 Id parent_id, | 360 Id parent_id, |
| 361 Id child_id, | 361 Id child_id, |
| 362 const Callback<void(bool)>& callback) { | 362 const Callback<void(bool)>& callback) { |
| 363 bool success = false; | 363 bool success = false; |
| 364 Node* parent = GetNode(NodeIdFromTransportId(parent_id)); | 364 Node* parent = GetNode(NodeIdFromTransportId(parent_id)); |
| 365 Node* child = GetNode(NodeIdFromTransportId(child_id)); | 365 Node* child = GetNode(NodeIdFromTransportId(child_id)); |
| 366 if (parent && child && child->GetParent() != parent && | 366 if (parent && child && child->GetParent() != parent && |
| 367 !child->Contains(parent) && access_policy_->CanAddNode(parent, child)) { | 367 !child->Contains(parent) && access_policy_->CanAddNode(parent, child)) { |
| 368 success = true; | 368 success = true; |
| 369 RootNodeManager::ScopedChange change(this, root_node_manager_, false); | 369 RootNodeManager::ScopedChange change(this, root_node_manager_, false); |
| 370 parent->Add(child); | 370 parent->Add(child); |
| 371 } | 371 } |
| 372 callback.Run(success); | 372 callback.Run(success); |
| 373 } | 373 } |
| 374 | 374 |
| 375 void ViewManagerServiceImpl::RemoveNodeFromParent( | 375 void ViewManagerServiceImpl::RemoveViewFromParent( |
| 376 Id node_id, | 376 Id view_id, |
| 377 const Callback<void(bool)>& callback) { | 377 const Callback<void(bool)>& callback) { |
| 378 bool success = false; | 378 bool success = false; |
| 379 Node* node = GetNode(NodeIdFromTransportId(node_id)); | 379 Node* node = GetNode(NodeIdFromTransportId(view_id)); |
| 380 if (node && node->GetParent() && | 380 if (node && node->GetParent() && |
| 381 access_policy_->CanRemoveNodeFromParent(node)) { | 381 access_policy_->CanRemoveNodeFromParent(node)) { |
| 382 success = true; | 382 success = true; |
| 383 RootNodeManager::ScopedChange change(this, root_node_manager_, false); | 383 RootNodeManager::ScopedChange change(this, root_node_manager_, false); |
| 384 node->GetParent()->Remove(node); | 384 node->GetParent()->Remove(node); |
| 385 } | 385 } |
| 386 callback.Run(success); | 386 callback.Run(success); |
| 387 } | 387 } |
| 388 | 388 |
| 389 void ViewManagerServiceImpl::ReorderNode(Id node_id, | 389 void ViewManagerServiceImpl::ReorderView(Id view_id, |
| 390 Id relative_node_id, | 390 Id relative_view_id, |
| 391 OrderDirection direction, | 391 OrderDirection direction, |
| 392 const Callback<void(bool)>& callback) { | 392 const Callback<void(bool)>& callback) { |
| 393 bool success = false; | 393 bool success = false; |
| 394 Node* node = GetNode(NodeIdFromTransportId(node_id)); | 394 Node* node = GetNode(NodeIdFromTransportId(view_id)); |
| 395 Node* relative_node = GetNode(NodeIdFromTransportId(relative_node_id)); | 395 Node* relative_node = GetNode(NodeIdFromTransportId(relative_view_id)); |
| 396 if (CanReorderNode(node, relative_node, direction)) { | 396 if (CanReorderNode(node, relative_node, direction)) { |
| 397 success = true; | 397 success = true; |
| 398 RootNodeManager::ScopedChange change(this, root_node_manager_, false); | 398 RootNodeManager::ScopedChange change(this, root_node_manager_, false); |
| 399 node->GetParent()->Reorder(node, relative_node, direction); | 399 node->GetParent()->Reorder(node, relative_node, direction); |
| 400 root_node_manager_->ProcessNodeReorder(node, relative_node, direction); | 400 root_node_manager_->ProcessNodeReorder(node, relative_node, direction); |
| 401 } | 401 } |
| 402 callback.Run(success); | 402 callback.Run(success); |
| 403 } | 403 } |
| 404 | 404 |
| 405 void ViewManagerServiceImpl::GetNodeTree( | 405 void ViewManagerServiceImpl::GetViewTree( |
| 406 Id node_id, | 406 Id view_id, |
| 407 const Callback<void(Array<NodeDataPtr>)>& callback) { | 407 const Callback<void(Array<ViewDataPtr>)>& callback) { |
| 408 Node* node = GetNode(NodeIdFromTransportId(node_id)); | 408 Node* node = GetNode(NodeIdFromTransportId(view_id)); |
| 409 std::vector<const Node*> nodes; | 409 std::vector<const Node*> nodes; |
| 410 if (node) { | 410 if (node) { |
| 411 GetNodeTreeImpl(node, &nodes); | 411 GetNodeTreeImpl(node, &nodes); |
| 412 // TODO(sky): this should map in nodes that weren't none. | 412 // TODO(sky): this should map in nodes that weren't none. |
| 413 } | 413 } |
| 414 callback.Run(NodesToNodeDatas(nodes)); | 414 callback.Run(NodesToViewDatas(nodes)); |
| 415 } | 415 } |
| 416 | 416 |
| 417 void ViewManagerServiceImpl::SetNodeContents( | 417 void ViewManagerServiceImpl::SetViewContents( |
| 418 Id node_id, | 418 Id view_id, |
| 419 ScopedSharedBufferHandle buffer, | 419 ScopedSharedBufferHandle buffer, |
| 420 uint32_t buffer_size, | 420 uint32_t buffer_size, |
| 421 const Callback<void(bool)>& callback) { | 421 const Callback<void(bool)>& callback) { |
| 422 // TODO(sky): add coverage of not being able to set for random node. | 422 // TODO(sky): add coverage of not being able to set for random node. |
| 423 Node* node = GetNode(NodeIdFromTransportId(node_id)); | 423 Node* node = GetNode(NodeIdFromTransportId(view_id)); |
| 424 if (!node || !access_policy_->CanSetNodeContents(node)) { | 424 if (!node || !access_policy_->CanSetNodeContents(node)) { |
| 425 callback.Run(false); | 425 callback.Run(false); |
| 426 return; | 426 return; |
| 427 } | 427 } |
| 428 void* handle_data; | 428 void* handle_data; |
| 429 if (MapBuffer(buffer.get(), 0, buffer_size, &handle_data, | 429 if (MapBuffer(buffer.get(), 0, buffer_size, &handle_data, |
| 430 MOJO_MAP_BUFFER_FLAG_NONE) != MOJO_RESULT_OK) { | 430 MOJO_MAP_BUFFER_FLAG_NONE) != MOJO_RESULT_OK) { |
| 431 callback.Run(false); | 431 callback.Run(false); |
| 432 return; | 432 return; |
| 433 } | 433 } |
| 434 SkBitmap bitmap; | 434 SkBitmap bitmap; |
| 435 gfx::PNGCodec::Decode(static_cast<const unsigned char*>(handle_data), | 435 gfx::PNGCodec::Decode(static_cast<const unsigned char*>(handle_data), |
| 436 buffer_size, &bitmap); | 436 buffer_size, &bitmap); |
| 437 node->SetBitmap(bitmap); | 437 node->SetBitmap(bitmap); |
| 438 UnmapBuffer(handle_data); | 438 UnmapBuffer(handle_data); |
| 439 callback.Run(true); | 439 callback.Run(true); |
| 440 } | 440 } |
| 441 | 441 |
| 442 void ViewManagerServiceImpl::SetFocus(Id node_id, | 442 void ViewManagerServiceImpl::SetFocus(Id view_id, |
| 443 const Callback<void(bool)> & callback) { | 443 const Callback<void(bool)> & callback) { |
| 444 bool success = false; | 444 bool success = false; |
| 445 Node* node = GetNode(NodeIdFromTransportId(node_id)); | 445 Node* node = GetNode(NodeIdFromTransportId(view_id)); |
| 446 if (node && access_policy_->CanSetFocus(node)) { | 446 if (node && access_policy_->CanSetFocus(node)) { |
| 447 success = true; | 447 success = true; |
| 448 node->window()->Focus(); | 448 node->window()->Focus(); |
| 449 } | 449 } |
| 450 callback.Run(success); | 450 callback.Run(success); |
| 451 } | 451 } |
| 452 | 452 |
| 453 void ViewManagerServiceImpl::SetNodeBounds( | 453 void ViewManagerServiceImpl::SetViewBounds( |
| 454 Id node_id, | 454 Id view_id, |
| 455 RectPtr bounds, | 455 RectPtr bounds, |
| 456 const Callback<void(bool)>& callback) { | 456 const Callback<void(bool)>& callback) { |
| 457 Node* node = GetNode(NodeIdFromTransportId(node_id)); | 457 Node* node = GetNode(NodeIdFromTransportId(view_id)); |
| 458 const bool success = node && access_policy_->CanSetNodeBounds(node); | 458 const bool success = node && access_policy_->CanSetNodeBounds(node); |
| 459 if (success) { | 459 if (success) { |
| 460 RootNodeManager::ScopedChange change(this, root_node_manager_, false); | 460 RootNodeManager::ScopedChange change(this, root_node_manager_, false); |
| 461 gfx::Rect old_bounds = node->window()->bounds(); | 461 gfx::Rect old_bounds = node->window()->bounds(); |
| 462 node->window()->SetBounds(bounds.To<gfx::Rect>()); | 462 node->window()->SetBounds(bounds.To<gfx::Rect>()); |
| 463 } | 463 } |
| 464 callback.Run(success); | 464 callback.Run(success); |
| 465 } | 465 } |
| 466 | 466 |
| 467 void ViewManagerServiceImpl::SetNodeVisibility( | 467 void ViewManagerServiceImpl::SetViewVisibility( |
| 468 Id transport_node_id, | 468 Id transport_view_id, |
| 469 bool visible, | 469 bool visible, |
| 470 const Callback<void(bool)>& callback) { | 470 const Callback<void(bool)>& callback) { |
| 471 Node* node = GetNode(NodeIdFromTransportId(transport_node_id)); | 471 Node* node = GetNode(NodeIdFromTransportId(transport_view_id)); |
| 472 const bool success = node && node->IsVisible() != visible && | 472 const bool success = node && node->IsVisible() != visible && |
| 473 access_policy_->CanChangeNodeVisibility(node); | 473 access_policy_->CanChangeNodeVisibility(node); |
| 474 if (success) { | 474 if (success) { |
| 475 DCHECK(node); | 475 DCHECK(node); |
| 476 node->SetVisible(visible); | 476 node->SetVisible(visible); |
| 477 } | 477 } |
| 478 // TODO(sky): need to notify of visibility changes. | 478 // TODO(sky): need to notify of visibility changes. |
| 479 callback.Run(success); | 479 callback.Run(success); |
| 480 } | 480 } |
| 481 | 481 |
| 482 void ViewManagerServiceImpl::Embed( | 482 void ViewManagerServiceImpl::Embed( |
| 483 const String& url, | 483 const String& url, |
| 484 Id transport_node_id, | 484 Id transport_view_id, |
| 485 ServiceProviderPtr service_provider, | 485 ServiceProviderPtr service_provider, |
| 486 const Callback<void(bool)>& callback) { | 486 const Callback<void(bool)>& callback) { |
| 487 InterfaceRequest<ServiceProvider> spir; | 487 InterfaceRequest<ServiceProvider> spir; |
| 488 spir.Bind(service_provider.PassMessagePipe()); | 488 spir.Bind(service_provider.PassMessagePipe()); |
| 489 | 489 |
| 490 if (NodeIdFromTransportId(transport_node_id) == InvalidNodeId()) { | 490 if (NodeIdFromTransportId(transport_view_id) == InvalidNodeId()) { |
| 491 root_node_manager_->EmbedRoot(url, spir.Pass()); | 491 root_node_manager_->EmbedRoot(url, spir.Pass()); |
| 492 callback.Run(true); | 492 callback.Run(true); |
| 493 return; | 493 return; |
| 494 } | 494 } |
| 495 const Node* node = GetNode(NodeIdFromTransportId(transport_node_id)); | 495 const Node* node = GetNode(NodeIdFromTransportId(transport_view_id)); |
| 496 bool success = node && access_policy_->CanEmbed(node); | 496 bool success = node && access_policy_->CanEmbed(node); |
| 497 if (success) { | 497 if (success) { |
| 498 // Only allow a node to be the root for one connection. | 498 // Only allow a node to be the root for one connection. |
| 499 const NodeId node_id(NodeIdFromTransportId(transport_node_id)); | 499 const NodeId node_id(NodeIdFromTransportId(transport_view_id)); |
| 500 ViewManagerServiceImpl* connection_by_url = | 500 ViewManagerServiceImpl* connection_by_url = |
| 501 root_node_manager_->GetConnectionByCreator(id_, url.To<std::string>()); | 501 root_node_manager_->GetConnectionByCreator(id_, url.To<std::string>()); |
| 502 ViewManagerServiceImpl* connection_with_node_as_root = | 502 ViewManagerServiceImpl* connection_with_node_as_root = |
| 503 root_node_manager_->GetConnectionWithRoot(node_id); | 503 root_node_manager_->GetConnectionWithRoot(node_id); |
| 504 if ((connection_by_url != connection_with_node_as_root || | 504 if ((connection_by_url != connection_with_node_as_root || |
| 505 (!connection_by_url && !connection_with_node_as_root)) && | 505 (!connection_by_url && !connection_with_node_as_root)) && |
| 506 (!connection_by_url || !connection_by_url->HasRoot(node_id))) { | 506 (!connection_by_url || !connection_by_url->HasRoot(node_id))) { |
| 507 RootNodeManager::ScopedChange change(this, root_node_manager_, true); | 507 RootNodeManager::ScopedChange change(this, root_node_manager_, true); |
| 508 RemoveChildrenAsPartOfEmbed(node_id); | 508 RemoveChildrenAsPartOfEmbed(node_id); |
| 509 // Never message the originating connection. | 509 // Never message the originating connection. |
| 510 root_node_manager_->OnConnectionMessagedClient(id_); | 510 root_node_manager_->OnConnectionMessagedClient(id_); |
| 511 if (connection_with_node_as_root) | 511 if (connection_with_node_as_root) |
| 512 connection_with_node_as_root->RemoveRoot(node_id); | 512 connection_with_node_as_root->RemoveRoot(node_id); |
| 513 if (connection_by_url) { | 513 if (connection_by_url) { |
| 514 connection_by_url->AddRoot(node_id, spir.Pass()); | 514 connection_by_url->AddRoot(node_id, spir.Pass()); |
| 515 } else { | 515 } else { |
| 516 root_node_manager_->Embed(id_, url, transport_node_id, | 516 root_node_manager_->Embed(id_, url, transport_view_id, spir.Pass()); |
| 517 spir.Pass()); | |
| 518 } | 517 } |
| 519 } else { | 518 } else { |
| 520 success = false; | 519 success = false; |
| 521 } | 520 } |
| 522 } | 521 } |
| 523 callback.Run(success); | 522 callback.Run(success); |
| 524 } | 523 } |
| 525 | 524 |
| 526 void ViewManagerServiceImpl::DispatchOnNodeInputEvent(Id transport_node_id, | 525 void ViewManagerServiceImpl::DispatchOnViewInputEvent(Id transport_view_id, |
| 527 EventPtr event) { | 526 EventPtr event) { |
| 528 // We only allow the WM to dispatch events. At some point this function will | 527 // We only allow the WM to dispatch events. At some point this function will |
| 529 // move to a separate interface and the check can go away. | 528 // move to a separate interface and the check can go away. |
| 530 if (id_ != kWindowManagerConnection) | 529 if (id_ != kWindowManagerConnection) |
| 531 return; | 530 return; |
| 532 | 531 |
| 533 const NodeId node_id(NodeIdFromTransportId(transport_node_id)); | 532 const NodeId node_id(NodeIdFromTransportId(transport_view_id)); |
| 534 | 533 |
| 535 // If another app is embedded at this node, we forward the input event to the | 534 // If another app is embedded at this node, we forward the input event to the |
| 536 // embedded app, rather than the app that created the node. | 535 // embedded app, rather than the app that created the node. |
| 537 ViewManagerServiceImpl* connection = | 536 ViewManagerServiceImpl* connection = |
| 538 root_node_manager_->GetConnectionWithRoot(node_id); | 537 root_node_manager_->GetConnectionWithRoot(node_id); |
| 539 if (!connection) | 538 if (!connection) |
| 540 connection = root_node_manager_->GetConnection(node_id.connection_id); | 539 connection = root_node_manager_->GetConnection(node_id.connection_id); |
| 541 if (connection) { | 540 if (connection) { |
| 542 connection->client()->OnNodeInputEvent( | 541 connection->client()->OnViewInputEvent( |
| 543 transport_node_id, | 542 transport_view_id, |
| 544 event.Pass(), | 543 event.Pass(), |
| 545 base::Bind(&base::DoNothing)); | 544 base::Bind(&base::DoNothing)); |
| 546 } | 545 } |
| 547 } | 546 } |
| 548 | 547 |
| 549 void ViewManagerServiceImpl::OnConnectionEstablished() { | 548 void ViewManagerServiceImpl::OnConnectionEstablished() { |
| 550 root_node_manager_->AddConnection(this); | 549 root_node_manager_->AddConnection(this); |
| 551 | 550 |
| 552 std::vector<const Node*> to_send; | 551 std::vector<const Node*> to_send; |
| 553 for (NodeIdSet::const_iterator i = roots_.begin(); i != roots_.end(); ++i) | 552 for (NodeIdSet::const_iterator i = roots_.begin(); i != roots_.end(); ++i) |
| 554 GetUnknownNodesFrom(GetNode(NodeIdFromTransportId(*i)), &to_send); | 553 GetUnknownNodesFrom(GetNode(NodeIdFromTransportId(*i)), &to_send); |
| 555 | 554 |
| 556 client()->OnEmbed(id_, creator_url_, NodeToNodeData(to_send.front()), | 555 client()->OnEmbed(id_, creator_url_, NodeToViewData(to_send.front()), |
| 557 service_provider_.Pass()); | 556 service_provider_.Pass()); |
| 558 } | 557 } |
| 559 | 558 |
| 560 const base::hash_set<Id>& | 559 const base::hash_set<Id>& |
| 561 ViewManagerServiceImpl::GetRootsForAccessPolicy() const { | 560 ViewManagerServiceImpl::GetRootsForAccessPolicy() const { |
| 562 return roots_; | 561 return roots_; |
| 563 } | 562 } |
| 564 | 563 |
| 565 bool ViewManagerServiceImpl::IsNodeKnownForAccessPolicy( | 564 bool ViewManagerServiceImpl::IsNodeKnownForAccessPolicy( |
| 566 const Node* node) const { | 565 const Node* node) const { |
| 567 return IsNodeKnown(node); | 566 return IsNodeKnown(node); |
| 568 } | 567 } |
| 569 | 568 |
| 570 bool ViewManagerServiceImpl::IsNodeRootOfAnotherConnectionForAccessPolicy( | 569 bool ViewManagerServiceImpl::IsNodeRootOfAnotherConnectionForAccessPolicy( |
| 571 const Node* node) const { | 570 const Node* node) const { |
| 572 ViewManagerServiceImpl* connection = | 571 ViewManagerServiceImpl* connection = |
| 573 root_node_manager_->GetConnectionWithRoot(node->id()); | 572 root_node_manager_->GetConnectionWithRoot(node->id()); |
| 574 return connection && connection != this; | 573 return connection && connection != this; |
| 575 } | 574 } |
| 576 | 575 |
| 577 } // namespace service | 576 } // namespace service |
| 578 } // namespace mojo | 577 } // namespace mojo |
| OLD | NEW |