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

Side by Side Diff: mojo/services/view_manager/view_manager_service_impl.cc

Issue 460863002: Rename Node to View in the View Manager mojom & client lib. Service TBD. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: . Created 6 years, 4 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_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
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
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
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
OLDNEW
« no previous file with comments | « mojo/services/view_manager/view_manager_service_impl.h ('k') | mojo/services/view_manager/view_manager_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698