Index: mojo/services/view_manager/view_locator.cc |
diff --git a/mojo/services/view_manager/view_locator.cc b/mojo/services/view_manager/view_locator.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..672b7c83e5a8dac3a4e5276359eb8e4d0b852d2d |
--- /dev/null |
+++ b/mojo/services/view_manager/view_locator.cc |
@@ -0,0 +1,35 @@ |
+// Copyright 2015 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/view_locator.h" |
+ |
+#include "mojo/services/view_manager/server_view.h" |
+ |
+namespace view_manager { |
+ |
+const ServerView* FindDeepestVisibleView(const ServerView* view, |
+ const gfx::Point& location) { |
+ for (const ServerView* child : view->GetChildren()) { |
+ if (!child->visible()) |
+ continue; |
+ |
+ // TODO(sky): support transform. |
+ const gfx::Point child_location(location.x() - child->bounds().x(), |
+ location.y() - child->bounds().y()); |
+ if (child_location.x() >= 0 && child_location.y() >= 0 && |
+ child_location.x() < child->bounds().width() && |
+ child_location.y() < child->bounds().height()) { |
+ return FindDeepestVisibleView(child, child_location); |
+ } |
+ } |
+ return view; |
+} |
+ |
+ServerView* FindDeepestVisibleView(ServerView* view, |
+ const gfx::Point& location) { |
+ return const_cast<ServerView*>( |
+ FindDeepestVisibleView(const_cast<const ServerView*>(view), location)); |
+} |
+ |
+} // namespace view_manager |