1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136
|
// Copyright 2024 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "ui/views/interaction/widget_focus_observer.h"
#include <memory>
#include <utility>
#include "base/functional/callback_helpers.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/base/interaction/framework_specific_implementation.h"
#include "ui/views/bubble/bubble_border.h"
#include "ui/views/bubble/bubble_dialog_delegate_view.h"
#include "ui/views/test/views_test_base.h"
#include "ui/views/test/widget_activation_waiter.h"
#include "ui/views/test/widget_test.h"
#include "ui/views/widget/widget.h"
namespace views {
namespace {
// Dummy supplier that doesn't do anything.
class DummyWidgetFocusSupplier : public test::internal::WidgetFocusSupplier {
public:
DummyWidgetFocusSupplier() = default;
~DummyWidgetFocusSupplier() override = default;
DECLARE_FRAMEWORK_SPECIFIC_METADATA()
protected:
Widget::Widgets GetAllWidgets() const override {
return test::WidgetTest::GetAllWidgets();
}
};
DEFINE_FRAMEWORK_SPECIFIC_METADATA(DummyWidgetFocusSupplier)
} // namespace
class WidgetFocusObserverTest : public ViewsTestBase {
public:
WidgetFocusObserverTest() {
frame_.supplier_list().MaybeRegister<DummyWidgetFocusSupplier>();
}
~WidgetFocusObserverTest() override = default;
private:
test::internal::WidgetFocusSupplierFrame frame_;
};
TEST_F(WidgetFocusObserverTest, NoWidgets) {
test::WidgetFocusObserver observer;
observer.SetStateObserverStateChangedCallback(base::DoNothing());
EXPECT_EQ(gfx::NativeView(), observer.GetStateObserverInitialState());
}
TEST_F(WidgetFocusObserverTest, OneWidget) {
const auto widget = CreateTestWidget(Widget::InitParams::CLIENT_OWNS_WIDGET);
test::WidgetVisibleWaiter visible_waiter(widget.get());
widget->Show();
visible_waiter.Wait();
test::WidgetFocusObserver observer;
observer.SetStateObserverStateChangedCallback(base::DoNothing());
EXPECT_EQ(widget->GetNativeView(), observer.GetStateObserverInitialState());
}
TEST_F(WidgetFocusObserverTest, SeveralWidgets) {
const auto widget1 = CreateTestWidget(Widget::InitParams::CLIENT_OWNS_WIDGET);
test::WidgetVisibleWaiter visible_waiter1(widget1.get());
widget1->Show();
visible_waiter1.Wait();
const auto widget2 = CreateTestWidget(Widget::InitParams::CLIENT_OWNS_WIDGET);
test::WidgetVisibleWaiter visible_waiter2(widget1.get());
widget2->Show();
visible_waiter2.Wait();
const auto widget3 = CreateTestWidget(Widget::InitParams::CLIENT_OWNS_WIDGET);
test::WidgetVisibleWaiter visible_waiter3(widget1.get());
widget3->ShowInactive();
visible_waiter3.Wait();
test::WidgetFocusObserver observer;
observer.SetStateObserverStateChangedCallback(base::DoNothing());
EXPECT_EQ(widget2->GetNativeView(), observer.GetStateObserverInitialState());
}
TEST_F(WidgetFocusObserverTest, AfterActivate) {
const auto widget1 = CreateTestWidget(Widget::InitParams::CLIENT_OWNS_WIDGET);
test::WidgetVisibleWaiter visible_waiter1(widget1.get());
widget1->Show();
visible_waiter1.Wait();
const auto widget2 = CreateTestWidget(Widget::InitParams::CLIENT_OWNS_WIDGET);
test::WidgetVisibleWaiter visible_waiter2(widget1.get());
widget2->Show();
visible_waiter2.Wait();
const auto widget3 = CreateTestWidget(Widget::InitParams::CLIENT_OWNS_WIDGET);
test::WidgetVisibleWaiter visible_waiter3(widget1.get());
widget3->ShowInactive();
visible_waiter3.Wait();
widget3->Activate();
test::WaitForWidgetActive(widget3.get(), true);
test::WidgetFocusObserver observer;
observer.SetStateObserverStateChangedCallback(base::DoNothing());
EXPECT_EQ(widget3->GetNativeView(), observer.GetStateObserverInitialState());
}
TEST_F(WidgetFocusObserverTest, Bubble) {
const auto widget = CreateTestWidget(Widget::InitParams::CLIENT_OWNS_WIDGET);
test::WidgetVisibleWaiter visible_waiter(widget.get());
widget->Show();
visible_waiter.Wait();
auto bubble = std::make_unique<BubbleDialogDelegateView>(
BubbleDialogDelegateView::CreatePassKey(), widget->GetRootView(),
BubbleBorder::LEFT_CENTER);
auto* const bubble_widget =
BubbleDialogDelegate::CreateBubble(std::move(bubble));
test::WidgetVisibleWaiter visible_waiter2(bubble_widget);
bubble_widget->Show();
visible_waiter2.Wait();
test::WidgetFocusObserver observer;
observer.SetStateObserverStateChangedCallback(base::DoNothing());
EXPECT_EQ(bubble_widget->GetNativeView(),
observer.GetStateObserverInitialState());
}
} // namespace views
|