Index: services/window_manager/basic_focus_rules.cc |
diff --git a/services/window_manager/basic_focus_rules.cc b/services/window_manager/basic_focus_rules.cc |
deleted file mode 100644 |
index 862f3e4f5c6be5e4797e51089490d6a1e93bdcc2..0000000000000000000000000000000000000000 |
--- a/services/window_manager/basic_focus_rules.cc |
+++ /dev/null |
@@ -1,171 +0,0 @@ |
-// 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/window_manager/basic_focus_rules.h" |
- |
-#include "base/macros.h" |
-#include "mojo/services/view_manager/cpp/view.h" |
- |
-using mojo::View; |
- |
-namespace window_manager { |
- |
-BasicFocusRules::BasicFocusRules(View* window_container) |
- : window_container_(window_container) { |
-} |
- |
-BasicFocusRules::~BasicFocusRules() {} |
- |
-bool BasicFocusRules::SupportsChildActivation(View* view) const { |
- return true; |
-} |
- |
-bool BasicFocusRules::IsToplevelView(View* view) const { |
- if (!IsViewParentedToWindowContainer(view)) |
- return false; |
- |
- // The window must exist within a container that supports activation. |
- // The window cannot be blocked by a modal transient. |
- return SupportsChildActivation(view->parent()); |
-} |
- |
-bool BasicFocusRules::CanActivateView(View* view) const { |
- if (!view) |
- return true; |
- |
- // Only toplevel windows can be activated |
- if (!IsToplevelView(view)) |
- return false; |
- |
- // The view must be visible. |
- if (!view->visible()) |
- return false; |
- |
- // TODO(erg): The aura version of this class asks the aura::Window's |
- // ActivationDelegate whether the window is activatable. |
- |
- // A window must be focusable to be activatable. We don't call |
- // CanFocusWindow() from here because it will call back to us via |
- // GetActivatableWindow(). |
- if (!CanFocusViewImpl(view)) |
- return false; |
- |
- // TODO(erg): In the aura version, we also check whether the window is |
- // blocked by a modal transient window. |
- |
- return true; |
-} |
- |
-bool BasicFocusRules::CanFocusView(View* view) const { |
- // It is possible to focus a NULL window, it is equivalent to clearing focus. |
- if (!view) |
- return true; |
- |
- // The focused view is always inside the active view, so views that aren't |
- // activatable can't contain the focused view. |
- View* activatable = GetActivatableView(view); |
- if (!activatable || !activatable->Contains(view)) |
- return false; |
- return CanFocusViewImpl(view); |
-} |
- |
-View* BasicFocusRules::GetToplevelView(View* view) const { |
- View* parent = view->parent(); |
- View* child = view; |
- while (parent) { |
- if (IsToplevelView(child)) |
- return child; |
- |
- parent = parent->parent(); |
- child = child->parent(); |
- } |
- |
- return nullptr; |
-} |
- |
-View* BasicFocusRules::GetActivatableView(View* view) const { |
- View* parent = view->parent(); |
- View* child = view; |
- while (parent) { |
- if (CanActivateView(child)) |
- return child; |
- |
- // TODO(erg): In the aura version of this class, we have a whole bunch of |
- // checks to support modal transient windows, and transient parents. |
- |
- parent = parent->parent(); |
- child = child->parent(); |
- } |
- |
- return nullptr; |
-} |
- |
-View* BasicFocusRules::GetFocusableView(View* view) const { |
- if (CanFocusView(view)) |
- return view; |
- |
- // |view| may be in a hierarchy that is non-activatable, in which case we |
- // need to cut over to the activatable hierarchy. |
- View* activatable = GetActivatableView(view); |
- if (!activatable) { |
- // There may not be a related activatable hierarchy to cut over to, in which |
- // case we try an unrelated one. |
- View* toplevel = GetToplevelView(view); |
- if (toplevel) |
- activatable = GetNextActivatableView(toplevel); |
- if (!activatable) |
- return nullptr; |
- } |
- |
- if (!activatable->Contains(view)) { |
- // If there's already a child window focused in the activatable hierarchy, |
- // just use that (i.e. don't shift focus), otherwise we need to at least cut |
- // over to the activatable hierarchy. |
- View* focused = GetFocusableView(activatable); |
- return activatable->Contains(focused) ? focused : activatable; |
- } |
- |
- while (view && !CanFocusView(view)) |
- view = view->parent(); |
- return view; |
-} |
- |
-View* BasicFocusRules::GetNextActivatableView(View* activatable) const { |
- DCHECK(activatable); |
- |
- // In the basic scenarios handled by BasicFocusRules, the pool of activatable |
- // windows is limited to the |ignore|'s siblings. |
- const View::Children& siblings = activatable->parent()->children(); |
- DCHECK(!siblings.empty()); |
- |
- for (auto rit = siblings.rbegin(); rit != siblings.rend(); ++rit) { |
- View* cur = *rit; |
- if (cur == activatable) |
- continue; |
- if (CanActivateView(cur)) |
- return cur; |
- } |
- return nullptr; |
-} |
- |
-// TODO(erg): aura::Window::CanFocus() exists. View::CanFocus() does |
-// not. This is a hack that does everything that Window::CanFocus() currently |
-// does that doesn't require a delegate or an EventClient. |
-bool BasicFocusRules::CanFocusViewImpl(View* view) const { |
- // TODO(erg): In unit tests, views will never be drawn, so we can't rely on |
- // IsDrawn() here. |
- if (IsViewParentedToWindowContainer(view)) |
- return view->visible(); |
- |
- // TODO(erg): Add the intermediary delegate and event client checks once we |
- // have those. |
- |
- return CanFocusViewImpl(view->parent()); |
-} |
- |
-bool BasicFocusRules::IsViewParentedToWindowContainer(View* view) const { |
- return view->parent() == window_container_; |
-} |
- |
-} // namespace mojo |