Index: components/mus/ws/focus_controller_unittest.cc |
diff --git a/components/mus/ws/focus_controller_unittest.cc b/components/mus/ws/focus_controller_unittest.cc |
deleted file mode 100644 |
index 563de06e87597b3705129345441f9f858ad5b1e4..0000000000000000000000000000000000000000 |
--- a/components/mus/ws/focus_controller_unittest.cc |
+++ /dev/null |
@@ -1,312 +0,0 @@ |
-// 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 "components/mus/ws/focus_controller.h" |
- |
-#include <stddef.h> |
-#include <stdint.h> |
- |
-#include "base/macros.h" |
-#include "components/mus/ws/focus_controller_delegate.h" |
-#include "components/mus/ws/focus_controller_observer.h" |
-#include "components/mus/ws/server_window.h" |
-#include "components/mus/ws/test_server_window_delegate.h" |
-#include "testing/gtest/include/gtest/gtest.h" |
- |
-namespace mus { |
- |
-namespace ws { |
-namespace { |
- |
-const char kDisallowActiveChildren[] = "disallow-active-children"; |
- |
-class TestFocusControllerObserver : public FocusControllerObserver, |
- public FocusControllerDelegate { |
- public: |
- TestFocusControllerObserver() |
- : ignore_explicit_(true), |
- focus_change_count_(0u), |
- old_focused_window_(nullptr), |
- new_focused_window_(nullptr), |
- old_active_window_(nullptr), |
- new_active_window_(nullptr) {} |
- |
- void ClearAll() { |
- focus_change_count_ = 0u; |
- old_focused_window_ = nullptr; |
- new_focused_window_ = nullptr; |
- old_active_window_ = nullptr; |
- new_active_window_ = nullptr; |
- } |
- size_t focus_change_count() const { return focus_change_count_; } |
- ServerWindow* old_focused_window() { return old_focused_window_; } |
- ServerWindow* new_focused_window() { return new_focused_window_; } |
- |
- ServerWindow* old_active_window() { return old_active_window_; } |
- ServerWindow* new_active_window() { return new_active_window_; } |
- |
- void set_ignore_explicit(bool ignore) { ignore_explicit_ = ignore; } |
- |
- private: |
- // FocusControllerDelegate: |
- bool CanHaveActiveChildren(ServerWindow* window) const override { |
- return !window || window->properties().count(kDisallowActiveChildren) == 0; |
- } |
- // FocusControllerObserver: |
- void OnActivationChanged(ServerWindow* old_active_window, |
- ServerWindow* new_active_window) override { |
- old_active_window_ = old_active_window; |
- new_active_window_ = new_active_window; |
- } |
- void OnFocusChanged(FocusControllerChangeSource source, |
- ServerWindow* old_focused_window, |
- ServerWindow* new_focused_window) override { |
- if (ignore_explicit_ && source == FocusControllerChangeSource::EXPLICIT) |
- return; |
- |
- focus_change_count_++; |
- old_focused_window_ = old_focused_window; |
- new_focused_window_ = new_focused_window; |
- } |
- |
- bool ignore_explicit_; |
- size_t focus_change_count_; |
- ServerWindow* old_focused_window_; |
- ServerWindow* new_focused_window_; |
- ServerWindow* old_active_window_; |
- ServerWindow* new_active_window_; |
- |
- DISALLOW_COPY_AND_ASSIGN(TestFocusControllerObserver); |
-}; |
- |
-} // namespace |
- |
-TEST(FocusControllerTest, Basic) { |
- TestServerWindowDelegate server_window_delegate; |
- ServerWindow root(&server_window_delegate, WindowId()); |
- server_window_delegate.set_root_window(&root); |
- root.SetVisible(true); |
- ServerWindow child(&server_window_delegate, WindowId()); |
- child.SetVisible(true); |
- root.Add(&child); |
- ServerWindow child_child(&server_window_delegate, WindowId()); |
- child_child.SetVisible(true); |
- child.Add(&child_child); |
- |
- TestFocusControllerObserver focus_observer; |
- FocusController focus_controller(&focus_observer, &root); |
- focus_controller.AddObserver(&focus_observer); |
- |
- focus_controller.SetFocusedWindow(&child_child); |
- EXPECT_EQ(0u, focus_observer.focus_change_count()); |
- |
- // Remove the ancestor of the focused window, focus should go to the |root|. |
- root.Remove(&child); |
- EXPECT_EQ(1u, focus_observer.focus_change_count()); |
- EXPECT_EQ(&root, focus_observer.new_focused_window()); |
- EXPECT_EQ(&child_child, focus_observer.old_focused_window()); |
- focus_observer.ClearAll(); |
- |
- // Make the focused window invisible. Focus is lost in this case (as no one |
- // to give focus to). |
- root.SetVisible(false); |
- EXPECT_EQ(1u, focus_observer.focus_change_count()); |
- EXPECT_EQ(nullptr, focus_observer.new_focused_window()); |
- EXPECT_EQ(&root, focus_observer.old_focused_window()); |
- focus_observer.ClearAll(); |
- |
- // Go back to initial state and focus |child_child|. |
- root.SetVisible(true); |
- root.Add(&child); |
- focus_controller.SetFocusedWindow(&child_child); |
- EXPECT_EQ(0u, focus_observer.focus_change_count()); |
- |
- // Hide the focused window, focus should go to parent. |
- child_child.SetVisible(false); |
- EXPECT_EQ(1u, focus_observer.focus_change_count()); |
- EXPECT_EQ(&child, focus_observer.new_focused_window()); |
- EXPECT_EQ(&child_child, focus_observer.old_focused_window()); |
- focus_observer.ClearAll(); |
- |
- child_child.SetVisible(true); |
- focus_controller.SetFocusedWindow(&child_child); |
- EXPECT_EQ(0u, focus_observer.focus_change_count()); |
- |
- // Hide the parent of the focused window. |
- child.SetVisible(false); |
- EXPECT_EQ(1u, focus_observer.focus_change_count()); |
- EXPECT_EQ(&root, focus_observer.new_focused_window()); |
- EXPECT_EQ(&child_child, focus_observer.old_focused_window()); |
- focus_observer.ClearAll(); |
- focus_controller.RemoveObserver(&focus_observer); |
-} |
- |
-// Tests that focus shifts correctly if the focused window is destroyed. |
-TEST(FocusControllerTest, FocusShiftsOnDestroy) { |
- TestServerWindowDelegate server_window_delegate; |
- ServerWindow parent(&server_window_delegate, WindowId()); |
- server_window_delegate.set_root_window(&parent); |
- parent.SetVisible(true); |
- ServerWindow child_first(&server_window_delegate, WindowId()); |
- child_first.SetVisible(true); |
- parent.Add(&child_first); |
- std::unique_ptr<ServerWindow> child_second( |
- new ServerWindow(&server_window_delegate, WindowId())); |
- child_second->SetVisible(true); |
- parent.Add(child_second.get()); |
- std::vector<uint8_t> dummy; |
- // Allow only |parent| to be activated. |
- parent.SetProperty(kDisallowActiveChildren, &dummy); |
- |
- TestFocusControllerObserver focus_observer; |
- focus_observer.set_ignore_explicit(false); |
- FocusController focus_controller(&focus_observer, &parent); |
- focus_controller.AddObserver(&focus_observer); |
- |
- focus_controller.ActivateNextWindow(); |
- EXPECT_EQ(nullptr, focus_observer.old_active_window()); |
- EXPECT_EQ(&parent, focus_observer.new_active_window()); |
- EXPECT_EQ(nullptr, focus_observer.old_focused_window()); |
- EXPECT_EQ(child_second.get(), focus_observer.new_focused_window()); |
- focus_observer.ClearAll(); |
- |
- // Destroying |child_second| should move focus to |child_first|. |
- child_second.reset(); |
- EXPECT_NE(nullptr, focus_observer.old_focused_window()); |
- EXPECT_EQ(&child_first, focus_observer.new_focused_window()); |
- |
- focus_controller.RemoveObserver(&focus_observer); |
-} |
- |
-TEST(FocusControllerTest, ActivationSkipsOverHiddenWindow) { |
- TestServerWindowDelegate server_window_delegate; |
- ServerWindow parent(&server_window_delegate, WindowId()); |
- server_window_delegate.set_root_window(&parent); |
- parent.SetVisible(true); |
- |
- ServerWindow child_first(&server_window_delegate, WindowId()); |
- ServerWindow child_second(&server_window_delegate, WindowId()); |
- ServerWindow child_third(&server_window_delegate, WindowId()); |
- |
- parent.Add(&child_first); |
- parent.Add(&child_second); |
- parent.Add(&child_third); |
- |
- child_first.SetVisible(true); |
- child_second.SetVisible(false); |
- child_third.SetVisible(true); |
- |
- TestFocusControllerObserver focus_observer; |
- focus_observer.set_ignore_explicit(false); |
- FocusController focus_controller(&focus_observer, &parent); |
- focus_controller.AddObserver(&focus_observer); |
- |
- // Since |child_second| is invisible, activation should cycle from |
- // |child_third|, to |child_first|, to |parent|, back to |child_third|. |
- focus_controller.ActivateNextWindow(); |
- EXPECT_EQ(nullptr, focus_observer.old_active_window()); |
- EXPECT_EQ(&child_third, focus_observer.new_active_window()); |
- focus_observer.ClearAll(); |
- |
- focus_controller.ActivateNextWindow(); |
- EXPECT_EQ(&child_third, focus_observer.old_active_window()); |
- EXPECT_EQ(&child_first, focus_observer.new_active_window()); |
- focus_observer.ClearAll(); |
- |
- focus_controller.ActivateNextWindow(); |
- EXPECT_EQ(&child_first, focus_observer.old_active_window()); |
- EXPECT_EQ(&parent, focus_observer.new_active_window()); |
- focus_observer.ClearAll(); |
- |
- focus_controller.ActivateNextWindow(); |
- EXPECT_EQ(&parent, focus_observer.old_active_window()); |
- EXPECT_EQ(&child_third, focus_observer.new_active_window()); |
- focus_observer.ClearAll(); |
- |
- // Once |child_second| is made visible, activation should go from |
- // |child_third| to |child_second|. |
- child_second.SetVisible(true); |
- focus_controller.ActivateNextWindow(); |
- EXPECT_EQ(&child_third, focus_observer.old_active_window()); |
- EXPECT_EQ(&child_second, focus_observer.new_active_window()); |
-} |
- |
-TEST(FocusControllerTest, ActivationSkipsOverHiddenContainers) { |
- TestServerWindowDelegate server_window_delegate; |
- ServerWindow parent(&server_window_delegate, WindowId()); |
- server_window_delegate.set_root_window(&parent); |
- parent.SetVisible(true); |
- |
- ServerWindow child1(&server_window_delegate, WindowId()); |
- ServerWindow child2(&server_window_delegate, WindowId()); |
- |
- parent.Add(&child1); |
- parent.Add(&child2); |
- |
- child1.SetVisible(true); |
- child2.SetVisible(true); |
- |
- ServerWindow child11(&server_window_delegate, WindowId()); |
- ServerWindow child12(&server_window_delegate, WindowId()); |
- ServerWindow child21(&server_window_delegate, WindowId()); |
- ServerWindow child22(&server_window_delegate, WindowId()); |
- |
- child1.Add(&child11); |
- child1.Add(&child12); |
- child2.Add(&child21); |
- child2.Add(&child22); |
- |
- child11.SetVisible(true); |
- child12.SetVisible(true); |
- child21.SetVisible(true); |
- child22.SetVisible(true); |
- |
- TestFocusControllerObserver focus_observer; |
- FocusController focus_controller(&focus_observer, &parent); |
- focus_controller.AddObserver(&focus_observer); |
- |
- focus_controller.ActivateNextWindow(); |
- EXPECT_EQ(nullptr, focus_observer.old_active_window()); |
- EXPECT_EQ(&child22, focus_observer.new_active_window()); |
- focus_observer.ClearAll(); |
- |
- child2.SetVisible(false); |
- EXPECT_EQ(&child22, focus_observer.old_active_window()); |
- EXPECT_EQ(&child12, focus_observer.new_active_window()); |
-} |
- |
-TEST(FocusControllerTest, NonFocusableWindowNotActivated) { |
- TestServerWindowDelegate server_window_delegate; |
- ServerWindow parent(&server_window_delegate, WindowId()); |
- server_window_delegate.set_root_window(&parent); |
- parent.SetVisible(true); |
- |
- ServerWindow child_first(&server_window_delegate, WindowId()); |
- ServerWindow child_second(&server_window_delegate, WindowId()); |
- parent.Add(&child_first); |
- parent.Add(&child_second); |
- child_first.SetVisible(true); |
- child_second.SetVisible(true); |
- |
- TestFocusControllerObserver focus_observer; |
- focus_observer.set_ignore_explicit(false); |
- FocusController focus_controller(&focus_observer, &parent); |
- focus_controller.AddObserver(&focus_observer); |
- |
- child_first.set_can_focus(false); |
- |
- // |child_second| is activated first, but then activation skips over |
- // |child_first| and goes to |parent| instead. |
- focus_controller.ActivateNextWindow(); |
- EXPECT_EQ(nullptr, focus_observer.old_active_window()); |
- EXPECT_EQ(&child_second, focus_observer.new_active_window()); |
- focus_observer.ClearAll(); |
- |
- focus_controller.ActivateNextWindow(); |
- EXPECT_EQ(&child_second, focus_observer.old_active_window()); |
- EXPECT_EQ(&parent, focus_observer.new_active_window()); |
-} |
- |
-} // namespace ws |
-} // namespace mus |