Index: mojo/services/view_manager/window_manager_access_policy.cc |
diff --git a/mojo/services/view_manager/window_manager_access_policy.cc b/mojo/services/view_manager/window_manager_access_policy.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..18696a0d5f880e24a308e6268a225461198ce699 |
--- /dev/null |
+++ b/mojo/services/view_manager/window_manager_access_policy.cc |
@@ -0,0 +1,97 @@ |
+// 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 "mojo/services/view_manager/window_manager_access_policy.h" |
+ |
+#include "mojo/services/view_manager/access_policy_delegate.h" |
+#include "mojo/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 |