Index: mojo/services/view_manager/view_manager_service_impl.cc |
diff --git a/mojo/services/view_manager/view_manager_service_impl.cc b/mojo/services/view_manager/view_manager_service_impl.cc |
index d7353bb47a8cb5fdb0ef2f8b56e8039f20a575c2..3e1a06c9a9bf08119c529164632de75db57e759d 100644 |
--- a/mojo/services/view_manager/view_manager_service_impl.cc |
+++ b/mojo/services/view_manager/view_manager_service_impl.cc |
@@ -7,9 +7,11 @@ |
#include "base/bind.h" |
#include "mojo/services/public/cpp/geometry/geometry_type_converters.h" |
#include "mojo/services/public/cpp/input_events/input_events_type_converters.h" |
+#include "mojo/services/view_manager/default_access_policy.h" |
#include "mojo/services/view_manager/node.h" |
#include "mojo/services/view_manager/root_node_manager.h" |
#include "mojo/services/view_manager/view.h" |
+#include "mojo/services/view_manager/window_manager_access_policy.h" |
#include "third_party/skia/include/core/SkBitmap.h" |
#include "ui/aura/window.h" |
#include "ui/gfx/codec/png_codec.h" |
@@ -29,16 +31,20 @@ ViewManagerServiceImpl::ViewManagerServiceImpl( |
creator_id_(creator_id), |
creator_url_(creator_url), |
delete_on_connection_error_(false) { |
+ // TODO: http://crbug.com/397660 . |
if (root_id != InvalidNodeId()) { |
CHECK(GetNode(root_id)); |
roots_.insert(NodeIdToTransportId(root_id)); |
+ access_policy_.reset(new DefaultAccessPolicy(id_, this)); |
+ } else { |
+ access_policy_.reset(new WindowManagerAccessPolicy(id_, this)); |
} |
} |
ViewManagerServiceImpl::~ViewManagerServiceImpl() { |
// Delete any views we created. |
while (!view_map_.empty()) { |
- bool result = DeleteViewImpl(this, view_map_.begin()->second->id()); |
+ bool result = DeleteViewImpl(this, view_map_.begin()->second); |
DCHECK(result); |
} |
@@ -83,14 +89,11 @@ void ViewManagerServiceImpl::ProcessNodeBoundsChanged( |
const gfx::Rect& old_bounds, |
const gfx::Rect& new_bounds, |
bool originated_change) { |
- if (originated_change) |
+ if (originated_change || !IsNodeKnown(node)) |
return; |
- Id node_id = NodeIdToTransportId(node->id()); |
- if (known_nodes_.count(node_id) > 0) { |
- client()->OnNodeBoundsChanged(node_id, |
- Rect::From(old_bounds), |
- Rect::From(new_bounds)); |
- } |
+ client()->OnNodeBoundsChanged(NodeIdToTransportId(node->id()), |
+ Rect::From(old_bounds), |
+ Rect::From(new_bounds)); |
} |
void ViewManagerServiceImpl::ProcessNodeHierarchyChanged( |
@@ -98,47 +101,35 @@ void ViewManagerServiceImpl::ProcessNodeHierarchyChanged( |
const Node* new_parent, |
const Node* old_parent, |
bool originated_change) { |
- if (known_nodes_.count(NodeIdToTransportId(node->id())) > 0) { |
- if (originated_change) |
- return; |
- if (node->id().connection_id != id_ && !IsNodeDescendantOfRoots(node)) { |
- // Node was a descendant of roots and is no longer, treat it as though the |
- // node was deleted. |
- RemoveFromKnown(node, NULL); |
- client()->OnNodeDeleted(NodeIdToTransportId(node->id())); |
- root_node_manager_->OnConnectionMessagedClient(id_); |
- return; |
- } |
+ if (originated_change || root_node_manager_->is_processing_delete_node() || |
+ root_node_manager_->DidConnectionMessageClient(id_)) { |
+ return; |
} |
- if (originated_change || root_node_manager_->is_processing_delete_node()) |
- return; |
- std::vector<const Node*> to_send; |
- if (!ShouldNotifyOnHierarchyChange(node, &new_parent, &old_parent, |
- &to_send)) { |
+ if (!access_policy_->ShouldNotifyOnHierarchyChange( |
+ node, &new_parent, &old_parent)) { |
return; |
} |
+ // Inform the client of any new nodes and update the set of nodes we know |
+ // about. |
+ std::vector<const Node*> to_send; |
+ if (!IsNodeKnown(node)) |
+ GetUnknownNodesFrom(node, &to_send); |
const NodeId new_parent_id(new_parent ? new_parent->id() : NodeId()); |
const NodeId old_parent_id(old_parent ? old_parent->id() : NodeId()); |
- DCHECK((node->id().connection_id == id_) || |
- (roots_.count(NodeIdToTransportId(node->id())) > 0) || |
- (new_parent && IsNodeDescendantOfRoots(new_parent)) || |
- (old_parent && IsNodeDescendantOfRoots(old_parent))); |
client()->OnNodeHierarchyChanged(NodeIdToTransportId(node->id()), |
NodeIdToTransportId(new_parent_id), |
NodeIdToTransportId(old_parent_id), |
NodesToNodeDatas(to_send)); |
+ root_node_manager_->OnConnectionMessagedClient(id_); |
} |
void ViewManagerServiceImpl::ProcessNodeReorder(const Node* node, |
const Node* relative_node, |
OrderDirection direction, |
bool originated_change) { |
- if (originated_change || |
- !known_nodes_.count(NodeIdToTransportId(node->id())) || |
- !known_nodes_.count(NodeIdToTransportId(relative_node->id()))) { |
+ if (originated_change || !IsNodeKnown(node) || !IsNodeKnown(relative_node)) |
return; |
- } |
client()->OnNodeReordered(NodeIdToTransportId(node->id()), |
NodeIdToTransportId(relative_node->id()), |
@@ -150,12 +141,14 @@ void ViewManagerServiceImpl::ProcessNodeViewReplaced( |
const View* new_view, |
const View* old_view, |
bool originated_change) { |
- if (originated_change || !known_nodes_.count(NodeIdToTransportId(node->id()))) |
+ if (originated_change || !IsNodeKnown(node) || |
+ root_node_manager_->is_processing_delete_node()) { |
return; |
+ } |
const Id new_view_id = new_view ? |
- ViewIdToTransportId(new_view->id()) : 0; |
+ access_policy_->GetViewIdToSend(node, new_view) : 0; |
const Id old_view_id = old_view ? |
- ViewIdToTransportId(old_view->id()) : 0; |
+ access_policy_->GetViewIdToSend(node, old_view) : 0; |
client()->OnNodeViewReplaced(NodeIdToTransportId(node->id()), |
new_view_id, old_view_id); |
} |
@@ -167,6 +160,7 @@ void ViewManagerServiceImpl::ProcessNodeDeleted(const NodeId& node, |
const bool in_known = known_nodes_.erase(NodeIdToTransportId(node)) > 0; |
const bool in_roots = roots_.erase(NodeIdToTransportId(node)) > 0; |
+ // TODO(sky): cleanup! |
if (in_roots && roots_.empty()) |
roots_.insert(NodeIdToTransportId(InvalidNodeId())); |
@@ -176,17 +170,13 @@ void ViewManagerServiceImpl::ProcessNodeDeleted(const NodeId& node, |
if (in_known) { |
client()->OnNodeDeleted(NodeIdToTransportId(node)); |
root_node_manager_->OnConnectionMessagedClient(id_); |
- } else if (root_node_manager_->IsProcessingChange() && |
- !root_node_manager_->DidConnectionMessageClient(id_)) { |
- root_node_manager_->OnConnectionMessagedClient(id_); |
} |
} |
void ViewManagerServiceImpl::ProcessViewDeleted(const ViewId& view, |
bool originated_change) { |
- if (originated_change) |
- return; |
- client()->OnViewDeleted(ViewIdToTransportId(view)); |
+ if (!originated_change && access_policy_->ShouldSendViewDeleted(view)) |
+ client()->OnViewDeleted(ViewIdToTransportId(view)); |
} |
void ViewManagerServiceImpl::ProcessFocusChanged(const Node* focused_node, |
@@ -195,18 +185,13 @@ void ViewManagerServiceImpl::ProcessFocusChanged(const Node* focused_node, |
if (originated_change) |
return; |
+ // TODO(sky): this should not notify all clients. |
Id focused_id = 0; |
Id blurred_id = 0; |
- if (focused_node) { |
- Id focused_node_id = NodeIdToTransportId(focused_node->id()); |
- if (known_nodes_.count(focused_node_id) > 0) |
- focused_id = focused_node_id; |
- } |
- if (blurred_node) { |
- Id blurred_node_id = NodeIdToTransportId(blurred_node->id()); |
- if (known_nodes_.count(blurred_node_id) > 0) |
- blurred_id = blurred_node_id; |
- } |
+ if (focused_node && IsNodeKnown(focused_node)) |
+ focused_id = NodeIdToTransportId(focused_node->id()); |
+ if (blurred_node && IsNodeKnown(blurred_node)) |
+ blurred_id = NodeIdToTransportId(blurred_node->id()); |
if (focused_id != 0 || blurred_id != 0) |
client()->OnFocusChanged(focused_id, blurred_id); |
@@ -217,54 +202,8 @@ void ViewManagerServiceImpl::OnConnectionError() { |
delete this; |
} |
-bool ViewManagerServiceImpl::CanRemoveNodeFromParent(const Node* node) const { |
- if (!node) |
- return false; |
- |
- const Node* parent = node->GetParent(); |
- if (!parent) |
- return false; |
- |
- if (roots_.empty()) |
- return true; // Root can do anything. |
- |
- if (node->id().connection_id != id_) |
- return false; // Can only unparent nodes we created. |
- |
- if (roots_.count(NodeIdToTransportId(parent->id())) > 0) |
- return true; // We can always remove from one of our roots. |
- |
- // Don't allow removing from nodes from other connections that aren't in our |
- // root list. |
- if (parent->id().connection_id != id_) |
- return false; |
- |
- // Allow the remove as long as we haven't embedded another node at |parent|. |
- ViewManagerServiceImpl* connection = |
- root_node_manager_->GetConnectionWithRoot(parent->id()); |
- return !connection || connection == this; |
-} |
- |
-bool ViewManagerServiceImpl::CanAddNode(const Node* parent, |
- const Node* child) const { |
- if (!parent || !child) |
- return false; // Both nodes must be valid. |
- |
- if (child->GetParent() == parent || child->Contains(parent)) |
- return false; // Would result in an invalid hierarchy. |
- |
- if (roots_.empty()) |
- return true; // No restriction if there are no roots. |
- |
- if (child->id().connection_id != id_) |
- return false; // Can't move children from different connections. |
- |
- if (!IsNodeDescendantOfRoots(parent) && parent->id().connection_id != id_) |
- return false; // |parent| is not visible to this connection. |
- |
- // Only allow the add if we haven't given one of the ancestors of |parent| to |
- // another node. That is, Embed() hasn't been invoked with one of our nodes. |
- return !IsNodeEmbeddedInAnotherConnection(parent); |
+bool ViewManagerServiceImpl::IsNodeKnown(const Node* node) const { |
+ return known_nodes_.count(NodeIdToTransportId(node->id())) > 0; |
} |
bool ViewManagerServiceImpl::CanReorderNode(const Node* node, |
@@ -273,14 +212,11 @@ bool ViewManagerServiceImpl::CanReorderNode(const Node* node, |
if (!node || !relative_node) |
return false; |
- if (node->id().connection_id != id_) |
- return false; |
- |
const Node* parent = node->GetParent(); |
if (!parent || parent != relative_node->GetParent()) |
return false; |
- if (known_nodes_.count(NodeIdToTransportId(parent->id())) == 0) |
+ if (!access_policy_->CanReorderNode(node, relative_node, direction)) |
return false; |
std::vector<const Node*> children = parent->GetChildren(); |
@@ -297,96 +233,31 @@ bool ViewManagerServiceImpl::CanReorderNode(const Node* node, |
return true; |
} |
-bool ViewManagerServiceImpl::CanDeleteNode(const NodeId& node_id) const { |
- return node_id.connection_id == id_; |
-} |
- |
-bool ViewManagerServiceImpl::CanDeleteView(const ViewId& view_id) const { |
- return view_id.connection_id == id_; |
-} |
- |
-bool ViewManagerServiceImpl::CanSetView(const Node* node, |
- const ViewId& view_id) const { |
- if (!node || !IsNodeDescendantOfRoots(node)) |
- return false; |
- |
- const View* view = GetView(view_id); |
- return (view && view_id.connection_id == id_) || view_id == ViewId(); |
-} |
- |
-bool ViewManagerServiceImpl::CanSetFocus(const Node* node) const { |
- // TODO(beng): security. |
- return true; |
-} |
- |
-bool ViewManagerServiceImpl::CanGetNodeTree(const Node* node) const { |
- if (!node) |
- return false; |
- |
- if (roots_.empty()) |
- return true; |
- |
- if (node->id().connection_id == id_) |
- return true; |
- |
- return roots_.count(NodeIdToTransportId(node->id())) > 0; |
-} |
- |
-bool ViewManagerServiceImpl::CanEmbed(Id transport_node_id) const { |
- const Node* node = GetNode(NodeIdFromTransportId(transport_node_id)); |
- return node && node->id().connection_id == id_; |
-} |
- |
-bool ViewManagerServiceImpl::CanSetNodeVisibility(const Node* node, |
- bool visibile) const { |
- return node && |
- (node->id().connection_id == id_ || |
- roots_.find(NodeIdToTransportId(node->id())) != roots_.end()) && |
- node->IsVisible() != visibile; |
-} |
- |
-bool ViewManagerServiceImpl::CanDescendIntoNodeForNodeTree( |
- const Node* node) const { |
- if (roots_.empty()) |
- return true; |
- |
- ViewManagerServiceImpl* connection = |
- root_node_manager_->GetConnectionWithRoot(node->id()); |
- return !connection || connection == this; |
-} |
- |
bool ViewManagerServiceImpl::DeleteNodeImpl(ViewManagerServiceImpl* source, |
- const NodeId& node_id) { |
- DCHECK_EQ(node_id.connection_id, id_); |
- Node* node = GetNode(node_id); |
- if (!node) |
- return false; |
+ Node* node) { |
+ DCHECK(node); |
+ DCHECK_EQ(node->id().connection_id, id_); |
RootNodeManager::ScopedChange change(source, root_node_manager_, true); |
delete node; |
return true; |
} |
bool ViewManagerServiceImpl::DeleteViewImpl(ViewManagerServiceImpl* source, |
- const ViewId& view_id) { |
- DCHECK_EQ(view_id.connection_id, id_); |
- View* view = GetView(view_id); |
- if (!view) |
- return false; |
+ View* view) { |
+ DCHECK(view); |
+ DCHECK_EQ(view->id().connection_id, id_); |
RootNodeManager::ScopedChange change(source, root_node_manager_, false); |
if (view->node()) |
view->node()->SetView(NULL); |
- view_map_.erase(view_id.view_id); |
- // Make a copy of |view_id| as once we delete view |view_id| may no longer be |
- // valid. |
- const ViewId view_id_copy(view_id); |
+ view_map_.erase(view->id().view_id); |
+ const ViewId view_id(view->id()); |
delete view; |
- root_node_manager_->ProcessViewDeleted(view_id_copy); |
+ root_node_manager_->ProcessViewDeleted(view_id); |
return true; |
} |
-bool ViewManagerServiceImpl::SetViewImpl(Node* node, const ViewId& view_id) { |
+bool ViewManagerServiceImpl::SetViewImpl(Node* node, View* view) { |
DCHECK(node); // CanSetView() should have verified node exists. |
- View* view = GetView(view_id); |
RootNodeManager::ScopedChange change(this, root_node_manager_, false); |
node->SetView(view); |
return true; |
@@ -395,11 +266,10 @@ bool ViewManagerServiceImpl::SetViewImpl(Node* node, const ViewId& view_id) { |
void ViewManagerServiceImpl::GetUnknownNodesFrom( |
const Node* node, |
std::vector<const Node*>* nodes) { |
- const Id transport_id = NodeIdToTransportId(node->id()); |
- if (known_nodes_.count(transport_id) == 1) |
+ if (IsNodeKnown(node)) |
return; |
nodes->push_back(node); |
- known_nodes_.insert(transport_id); |
+ known_nodes_.insert(NodeIdToTransportId(node->id())); |
std::vector<const Node*> children(node->GetChildren()); |
for (size_t i = 0 ; i < children.size(); ++i) |
GetUnknownNodesFrom(children[i], nodes); |
@@ -418,18 +288,6 @@ void ViewManagerServiceImpl::RemoveFromKnown(const Node* node, |
RemoveFromKnown(children[i], local_nodes); |
} |
-bool ViewManagerServiceImpl::IsNodeEmbeddedInAnotherConnection( |
- const Node* node) const { |
- while (node) { |
- const ViewManagerServiceImpl* connection = |
- root_node_manager_->GetConnectionWithRoot(node->id()); |
- if (connection) |
- return connection != this; |
- node = node->GetParent(); |
- } |
- return false; |
-} |
- |
void ViewManagerServiceImpl::AddRoot(const NodeId& node_id) { |
const Id transport_node_id(NodeIdToTransportId(node_id)); |
CHECK(roots_.count(transport_node_id) == 0); |
@@ -439,7 +297,7 @@ void ViewManagerServiceImpl::AddRoot(const NodeId& node_id) { |
roots_.insert(transport_node_id); |
Node* node = GetNode(node_id); |
CHECK(node); |
- if (known_nodes_.count(transport_node_id) == 0) { |
+ if (!IsNodeKnown(node)) { |
GetUnknownNodesFrom(node, &to_send); |
} else { |
// Even though the connection knows about the new root we need to tell it |
@@ -488,82 +346,21 @@ void ViewManagerServiceImpl::RemoveChildrenAsPartOfEmbed( |
node->Remove(children[i]); |
} |
-bool ViewManagerServiceImpl::IsNodeDescendantOfRoots(const Node* node) const { |
- if (roots_.empty()) |
- return true; |
- if (!node) |
- return false; |
- const Id invalid_node_id = NodeIdToTransportId(InvalidNodeId()); |
- for (NodeIdSet::const_iterator i = roots_.begin(); i != roots_.end(); ++i) { |
- if (*i == invalid_node_id) |
- continue; |
- const Node* root = GetNode(NodeIdFromTransportId(*i)); |
- DCHECK(root); |
- if (root->Contains(node)) |
- return true; |
- } |
- return false; |
-} |
- |
-bool ViewManagerServiceImpl::ShouldNotifyOnHierarchyChange( |
- const Node* node, |
- const Node** new_parent, |
- const Node** old_parent, |
- std::vector<const Node*>* to_send) { |
- // If the node is not in |roots_| or was never known to this connection then |
- // don't notify the client about it. |
- if (node->id().connection_id != id_ && |
- known_nodes_.count(NodeIdToTransportId(node->id())) == 0 && |
- !IsNodeDescendantOfRoots(node)) { |
- return false; |
- } |
- if (!IsNodeDescendantOfRoots(*new_parent)) |
- *new_parent = NULL; |
- if (!IsNodeDescendantOfRoots(*old_parent)) |
- *old_parent = NULL; |
- |
- if (*new_parent) { |
- // On getting a new parent we may need to communicate new nodes to the |
- // client. We do that in the following cases: |
- // . New parent is a descendant of the roots. In this case the client |
- // already knows all ancestors, so we only have to communicate descendants |
- // of node the client doesn't know about. |
- // . If the client knew about the parent, we have to do the same. |
- // . If the client knows about the node and is added to a tree the client |
- // doesn't know about we have to communicate from the root down (the |
- // client is learning about a new root). |
- if (root_node_manager_->root()->Contains(*new_parent) || |
- known_nodes_.count(NodeIdToTransportId((*new_parent)->id()))) { |
- GetUnknownNodesFrom(node, to_send); |
- return true; |
- } |
- // If parent wasn't known we have to communicate from the root down. |
- if (known_nodes_.count(NodeIdToTransportId(node->id()))) { |
- // No need to check against |roots_| as client should always know it's |
- // |roots_|. |
- GetUnknownNodesFrom((*new_parent)->GetRoot(), to_send); |
- return true; |
- } |
- } |
- // Otherwise only communicate the change if the node was known. We shouldn't |
- // need to communicate any nodes on a remove. |
- return known_nodes_.count(NodeIdToTransportId(node->id())) > 0; |
-} |
- |
Array<NodeDataPtr> ViewManagerServiceImpl::NodesToNodeDatas( |
const std::vector<const Node*>& nodes) { |
Array<NodeDataPtr> array(nodes.size()); |
for (size_t i = 0; i < nodes.size(); ++i) { |
const Node* node = nodes[i]; |
- DCHECK(known_nodes_.count(NodeIdToTransportId(node->id())) > 0); |
+ DCHECK(IsNodeKnown(node)); |
const Node* parent = node->GetParent(); |
// If the parent isn't known, it means the parent is not visible to us (not |
// in roots), and should not be sent over. |
- if (parent && known_nodes_.count(NodeIdToTransportId(parent->id())) == 0) |
+ if (parent && !IsNodeKnown(parent)) |
parent = NULL; |
NodeDataPtr inode(NodeData::New()); |
inode->parent_id = NodeIdToTransportId(parent ? parent->id() : NodeId()); |
inode->node_id = NodeIdToTransportId(node->id()); |
+ // TODO(sky): should the id only be sent if known? |
inode->view_id = |
ViewIdToTransportId(node->view() ? node->view()->id() : ViewId()); |
inode->bounds = Rect::From(node->bounds()); |
@@ -577,12 +374,12 @@ void ViewManagerServiceImpl::GetNodeTreeImpl( |
std::vector<const Node*>* nodes) const { |
DCHECK(node); |
- if (!CanGetNodeTree(node)) |
+ if (!access_policy_->CanGetNodeTree(node)) |
return; |
nodes->push_back(node); |
- if (!CanDescendIntoNodeForNodeTree(node)) |
+ if (!access_policy_->CanDescendIntoNodeForNodeTree(node)) |
return; |
std::vector<const Node*> children(node->GetChildren()); |
@@ -609,12 +406,12 @@ void ViewManagerServiceImpl::CreateNode( |
void ViewManagerServiceImpl::DeleteNode( |
Id transport_node_id, |
const Callback<void(bool)>& callback) { |
- const NodeId node_id(NodeIdFromTransportId(transport_node_id)); |
+ Node* node = GetNode(NodeIdFromTransportId(transport_node_id)); |
bool success = false; |
- if (CanDeleteNode(node_id)) { |
+ if (node && access_policy_->CanDeleteNode(node)) { |
ViewManagerServiceImpl* connection = root_node_manager_->GetConnection( |
- node_id.connection_id); |
- success = connection && connection->DeleteNodeImpl(this, node_id); |
+ node->id().connection_id); |
+ success = connection && connection->DeleteNodeImpl(this, node); |
} |
callback.Run(success); |
} |
@@ -626,7 +423,8 @@ void ViewManagerServiceImpl::AddNode( |
bool success = false; |
Node* parent = GetNode(NodeIdFromTransportId(parent_id)); |
Node* child = GetNode(NodeIdFromTransportId(child_id)); |
- if (CanAddNode(parent, child)) { |
+ if (parent && child && child->GetParent() != parent && |
+ !child->Contains(parent) && access_policy_->CanAddNode(parent, child)) { |
success = true; |
RootNodeManager::ScopedChange change(this, root_node_manager_, false); |
parent->Add(child); |
@@ -639,7 +437,8 @@ void ViewManagerServiceImpl::RemoveNodeFromParent( |
const Callback<void(bool)>& callback) { |
bool success = false; |
Node* node = GetNode(NodeIdFromTransportId(node_id)); |
- if (CanRemoveNodeFromParent(node)) { |
+ if (node && node->GetParent() && |
+ access_policy_->CanRemoveNodeFromParent(node)) { |
success = true; |
RootNodeManager::ScopedChange change(this, root_node_manager_, false); |
node->GetParent()->Remove(node); |
@@ -668,12 +467,9 @@ void ViewManagerServiceImpl::GetNodeTree( |
const Callback<void(Array<NodeDataPtr>)>& callback) { |
Node* node = GetNode(NodeIdFromTransportId(node_id)); |
std::vector<const Node*> nodes; |
- if (CanGetNodeTree(node)) { |
+ if (node) { |
GetNodeTreeImpl(node, &nodes); |
-#if !defined(NDEBUG) |
- for (size_t i = 0; i < nodes.size(); ++i) |
- DCHECK_GT(known_nodes_.count(NodeIdToTransportId(nodes[i]->id())), 0u); |
-#endif |
+ // TODO(sky): this should map in nodes that weren't none. |
} |
callback.Run(NodesToNodeDatas(nodes)); |
} |
@@ -690,15 +486,14 @@ void ViewManagerServiceImpl::CreateView( |
callback.Run(true); |
} |
-void ViewManagerServiceImpl::DeleteView( |
- Id transport_view_id, |
- const Callback<void(bool)>& callback) { |
- const ViewId view_id(ViewIdFromTransportId(transport_view_id)); |
- bool did_delete = CanDeleteView(view_id); |
- if (did_delete) { |
+void ViewManagerServiceImpl::DeleteView(Id transport_view_id, |
+ const Callback<void(bool)>& callback) { |
+ View* view = GetView(ViewIdFromTransportId(transport_view_id)); |
+ bool did_delete = false; |
+ if (view && access_policy_->CanDeleteView(view)) { |
ViewManagerServiceImpl* connection = root_node_manager_->GetConnection( |
- view_id.connection_id); |
- did_delete = (connection && connection->DeleteViewImpl(this, view_id)); |
+ view->id().connection_id); |
+ did_delete = (connection && connection->DeleteViewImpl(this, view)); |
} |
callback.Run(did_delete); |
} |
@@ -707,8 +502,11 @@ void ViewManagerServiceImpl::SetView(Id transport_node_id, |
Id transport_view_id, |
const Callback<void(bool)>& callback) { |
Node* node = GetNode(NodeIdFromTransportId(transport_node_id)); |
- const ViewId view_id(ViewIdFromTransportId(transport_view_id)); |
- callback.Run(CanSetView(node, view_id) && SetViewImpl(node, view_id)); |
+ View* view = GetView(ViewIdFromTransportId(transport_view_id)); |
+ const bool valid_view = view || |
+ ViewIdFromTransportId(transport_node_id) != ViewId(); |
+ callback.Run(valid_view && node && access_policy_->CanSetView(node, view) && |
+ SetViewImpl(node, view)); |
} |
void ViewManagerServiceImpl::SetViewContents( |
@@ -716,8 +514,9 @@ void ViewManagerServiceImpl::SetViewContents( |
ScopedSharedBufferHandle buffer, |
uint32_t buffer_size, |
const Callback<void(bool)>& callback) { |
+ // TODO(sky): add coverage of not being able to set for random view. |
View* view = GetView(ViewIdFromTransportId(view_id)); |
- if (!view) { |
+ if (!view || !access_policy_->CanSetViewContents(view)) { |
callback.Run(false); |
return; |
} |
@@ -739,7 +538,7 @@ void ViewManagerServiceImpl::SetFocus(Id node_id, |
const Callback<void(bool)> & callback) { |
bool success = false; |
Node* node = GetNode(NodeIdFromTransportId(node_id)); |
- if (CanSetFocus(node)) { |
+ if (node && access_policy_->CanSetFocus(node)) { |
success = true; |
node->window()->Focus(); |
} |
@@ -750,30 +549,23 @@ void ViewManagerServiceImpl::SetNodeBounds( |
Id node_id, |
RectPtr bounds, |
const Callback<void(bool)>& callback) { |
- if (NodeIdFromTransportId(node_id).connection_id != id_) { |
- callback.Run(false); |
- return; |
- } |
- |
Node* node = GetNode(NodeIdFromTransportId(node_id)); |
- if (!node) { |
- callback.Run(false); |
- return; |
+ const bool success = node && access_policy_->CanSetNodeBounds(node); |
+ if (success) { |
+ RootNodeManager::ScopedChange change(this, root_node_manager_, false); |
+ gfx::Rect old_bounds = node->window()->bounds(); |
+ node->window()->SetBounds(bounds.To<gfx::Rect>()); |
} |
- |
- RootNodeManager::ScopedChange change(this, root_node_manager_, false); |
- gfx::Rect old_bounds = node->window()->bounds(); |
- node->window()->SetBounds(bounds.To<gfx::Rect>()); |
- callback.Run(true); |
+ callback.Run(success); |
} |
void ViewManagerServiceImpl::SetNodeVisibility( |
Id transport_node_id, |
bool visible, |
const Callback<void(bool)>& callback) { |
- const NodeId node_id(NodeIdFromTransportId(transport_node_id)); |
- Node* node = GetNode(node_id); |
- const bool success = CanSetNodeVisibility(node, visible); |
+ Node* node = GetNode(NodeIdFromTransportId(transport_node_id)); |
+ const bool success = node && node->IsVisible() != visible && |
+ access_policy_->CanChangeNodeVisibility(node); |
if (success) { |
DCHECK(node); |
node->SetVisible(visible); |
@@ -790,7 +582,8 @@ void ViewManagerServiceImpl::Embed(const String& url, |
callback.Run(true); |
return; |
} |
- bool success = CanEmbed(transport_node_id); |
+ const Node* node = GetNode(NodeIdFromTransportId(transport_node_id)); |
+ bool success = node && access_policy_->CanEmbed(node); |
if (success) { |
// Only allow a node to be the root for one connection. |
const NodeId node_id(NodeIdFromTransportId(transport_node_id)); |
@@ -853,5 +646,22 @@ void ViewManagerServiceImpl::OnConnectionEstablished() { |
NodesToNodeDatas(to_send)); |
} |
+const base::hash_set<Id>& |
+ViewManagerServiceImpl::GetRootsForAccessPolicy() const { |
+ return roots_; |
+} |
+ |
+bool ViewManagerServiceImpl::IsNodeKnownForAccessPolicy( |
+ const Node* node) const { |
+ return IsNodeKnown(node); |
+} |
+ |
+bool ViewManagerServiceImpl::IsNodeRootOfAnotherConnectionForAccessPolicy( |
+ const Node* node) const { |
+ ViewManagerServiceImpl* connection = |
+ root_node_manager_->GetConnectionWithRoot(node->id()); |
+ return connection && connection != this; |
+} |
+ |
} // namespace service |
} // namespace mojo |