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
3// found in the LICENSE file.
4
5#include "mojo/services/view_manager/window_manager_access_policy.h"
6
7#include "mojo/services/view_manager/access_policy_delegate.h"
8#include "mojo/services/view_manager/server_view.h"
9
10namespace mojo {
11namespace service {
12
13// TODO(sky): document why this differs from default for each case. Maybe want
14// to subclass DefaultAccessPolicy.
15
16WindowManagerAccessPolicy::WindowManagerAccessPolicy(
17    ConnectionSpecificId connection_id,
18    AccessPolicyDelegate* delegate)
19    : connection_id_(connection_id),
20      delegate_(delegate) {
21}
22
23WindowManagerAccessPolicy::~WindowManagerAccessPolicy() {
24}
25
26bool WindowManagerAccessPolicy::CanRemoveViewFromParent(
27    const ServerView* view) const {
28  return true;
29}
30
31bool WindowManagerAccessPolicy::CanAddView(const ServerView* parent,
32                                           const ServerView* child) const {
33  return true;
34}
35
36bool WindowManagerAccessPolicy::CanReorderView(const ServerView* view,
37                                               const ServerView* relative_view,
38                                               OrderDirection direction) const {
39  return true;
40}
41
42bool WindowManagerAccessPolicy::CanDeleteView(const ServerView* view) const {
43  return view->id().connection_id == connection_id_;
44}
45
46bool WindowManagerAccessPolicy::CanGetViewTree(const ServerView* view) const {
47  return true;
48}
49
50bool WindowManagerAccessPolicy::CanDescendIntoViewForViewTree(
51    const ServerView* view) const {
52  return true;
53}
54
55bool WindowManagerAccessPolicy::CanEmbed(const ServerView* view) const {
56  return view->id().connection_id == connection_id_;
57}
58
59bool WindowManagerAccessPolicy::CanChangeViewVisibility(
60    const ServerView* view) const {
61  return view->id().connection_id == connection_id_;
62}
63
64bool WindowManagerAccessPolicy::CanSetViewSurfaceId(
65    const ServerView* view) const {
66  if (delegate_->IsViewRootOfAnotherConnectionForAccessPolicy(view))
67    return false;
68  return view->id().connection_id == connection_id_ ||
69         (delegate_->GetRootsForAccessPolicy().count(
70              ViewIdToTransportId(view->id())) > 0);
71}
72
73bool WindowManagerAccessPolicy::CanSetViewBounds(const ServerView* view) const {
74  return view->id().connection_id == connection_id_;
75}
76
77bool WindowManagerAccessPolicy::ShouldNotifyOnHierarchyChange(
78    const ServerView* view,
79    const ServerView** new_parent,
80    const ServerView** old_parent) const {
81  // Notify if we've already told the window manager about the view, or if we've
82  // already told the window manager about the parent. The later handles the
83  // case of a view that wasn't parented to the root getting added to the root.
84  return IsViewKnown(view) || (*new_parent && IsViewKnown(*new_parent));
85}
86
87bool WindowManagerAccessPolicy::IsViewKnown(const ServerView* view) const {
88  return delegate_->IsViewKnownForAccessPolicy(view);
89}
90
91}  // namespace service
92}  // namespace mojo
93