| // Copyright 2014 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "services/view_manager/window_manager_access_policy.h" |
| |
| #include "services/view_manager/access_policy_delegate.h" |
| #include "services/view_manager/server_view.h" |
| |
| namespace view_manager { |
| |
| // TODO(sky): document why this differs from default for each case. Maybe want |
| // to subclass DefaultAccessPolicy. |
| |
| WindowManagerAccessPolicy::WindowManagerAccessPolicy( |
| mojo::ConnectionSpecificId connection_id, |
| AccessPolicyDelegate* delegate) |
| : connection_id_(connection_id), delegate_(delegate) { |
| } |
| |
| WindowManagerAccessPolicy::~WindowManagerAccessPolicy() { |
| } |
| |
| bool WindowManagerAccessPolicy::CanRemoveViewFromParent( |
| const ServerView* view) const { |
| return true; |
| } |
| |
| bool WindowManagerAccessPolicy::CanAddView(const ServerView* parent, |
| const ServerView* child) const { |
| return true; |
| } |
| |
| bool WindowManagerAccessPolicy::CanReorderView( |
| const ServerView* view, |
| const ServerView* relative_view, |
| mojo::OrderDirection direction) const { |
| return true; |
| } |
| |
| bool WindowManagerAccessPolicy::CanDeleteView(const ServerView* view) const { |
| return view->id().connection_id == connection_id_; |
| } |
| |
| bool WindowManagerAccessPolicy::CanGetViewTree(const ServerView* view) const { |
| return view->id() != ClonedViewId(); |
| } |
| |
| bool WindowManagerAccessPolicy::CanDescendIntoViewForViewTree( |
| const ServerView* view) const { |
| return view->id() != ClonedViewId(); |
| } |
| |
| bool WindowManagerAccessPolicy::CanEmbed(const ServerView* view) const { |
| return view->id().connection_id == connection_id_; |
| } |
| |
| bool WindowManagerAccessPolicy::CanChangeViewVisibility( |
| const ServerView* view) const { |
| return view->id().connection_id == connection_id_; |
| } |
| |
| bool WindowManagerAccessPolicy::CanSetViewSurfaceId( |
| const ServerView* view) const { |
| if (delegate_->IsViewRootOfAnotherConnectionForAccessPolicy(view)) |
| return false; |
| return view->id().connection_id == connection_id_ || |
| (delegate_->IsRootForAccessPolicy(view->id())); |
| } |
| |
| bool WindowManagerAccessPolicy::CanSetViewBounds(const ServerView* view) const { |
| return view->id().connection_id == connection_id_; |
| } |
| |
| bool WindowManagerAccessPolicy::CanSetViewProperties( |
| const ServerView* view) const { |
| return view->id().connection_id == connection_id_; |
| } |
| |
| bool WindowManagerAccessPolicy::ShouldNotifyOnHierarchyChange( |
| const ServerView* view, |
| const ServerView** new_parent, |
| const ServerView** old_parent) const { |
| if (view->id() == ClonedViewId()) |
| return false; |
| |
| // Notify if we've already told the window manager about the view, or if we've |
| // already told the window manager about the parent. The later handles the |
| // case of a view that wasn't parented to the root getting added to the root. |
| return IsViewKnown(view) || (*new_parent && IsViewKnown(*new_parent)); |
| } |
| |
| bool WindowManagerAccessPolicy::IsViewKnown(const ServerView* view) const { |
| return delegate_->IsViewKnownForAccessPolicy(view); |
| } |
| |
| } // namespace view_manager |