| 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
|
|
|