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

Unified Diff: mojo/services/view_manager/view_manager_service_impl.cc

Issue 421693002: Adds an AccessPolicy that is queried to determine what a connection can do (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: cleanup Created 6 years, 5 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 side-by-side diff with in-line comments
Download patch
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..bc9711c0d4066f5295ecee5169ff5c0dcae9511c 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: change this!
Ben Goodger (Google) 2014/07/25 20:51:46 You can now go ahead and cite http://crbug.com/397
sky 2014/07/25 21:10:46 Done.
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::IsNodeEmbeddedInAnotherConnectionForAccessPolicy(
+ const Node* node) const {
+ ViewManagerServiceImpl* connection =
+ root_node_manager_->GetConnectionWithRoot(node->id());
+ return connection && connection != this;
+}
+
} // namespace service
} // namespace mojo

Powered by Google App Engine
This is Rietveld 408576698