blob: 25f0b0d8915ea1b8f351ad8b7d8e394ae50cd905 [file] [log] [blame]
// Copyright 2020 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/widget/any_widget_observer.h"
#include <memory>
#include <string>
#include <utility>
#include "base/functional/bind.h"
#include "base/task/single_thread_task_runner.h"
#include "base/test/bind.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/views/test/native_widget_factory.h"
#include "ui/views/test/widget_test.h"
namespace {
using views::Widget;
using AnyWidgetObserverTest = views::test::WidgetTest;
TEST_F(AnyWidgetObserverTest, ObservesInitialize) {
views::AnyWidgetObserver observer(views::test::AnyWidgetTestPasskey{});
bool initialized = false;
observer.set_initialized_callback(
base::BindLambdaForTesting([&](Widget*) { initialized = true; }));
EXPECT_FALSE(initialized);
std::unique_ptr<Widget> w0 =
base::WrapUnique(WidgetTest::CreateTopLevelPlatformWidget(
Widget::InitParams::CLIENT_OWNS_WIDGET));
EXPECT_TRUE(initialized);
}
TEST_F(AnyWidgetObserverTest, ObservesClose) {
views::AnyWidgetObserver observer(views::test::AnyWidgetTestPasskey{});
bool closing = false;
observer.set_closing_callback(
base::BindLambdaForTesting([&](Widget*) { closing = true; }));
EXPECT_FALSE(closing);
{
std::unique_ptr<Widget> w0 =
base::WrapUnique(WidgetTest::CreateTopLevelPlatformWidget(
Widget::InitParams::CLIENT_OWNS_WIDGET));
w0->CloseNow();
}
EXPECT_TRUE(closing);
}
TEST_F(AnyWidgetObserverTest, ObservesShow) {
views::AnyWidgetObserver observer(views::test::AnyWidgetTestPasskey{});
bool shown = false;
observer.set_shown_callback(
base::BindLambdaForTesting([&](Widget*) { shown = true; }));
EXPECT_FALSE(shown);
std::unique_ptr<Widget> w0 =
base::WrapUnique(WidgetTest::CreateTopLevelPlatformWidget(
Widget::InitParams::CLIENT_OWNS_WIDGET));
w0->Show();
EXPECT_TRUE(shown);
}
TEST_F(AnyWidgetObserverTest, ObservesHide) {
views::AnyWidgetObserver observer(views::test::AnyWidgetTestPasskey{});
bool hidden = false;
observer.set_hidden_callback(
base::BindLambdaForTesting([&](Widget*) { hidden = true; }));
EXPECT_FALSE(hidden);
std::unique_ptr<Widget> w0 =
base::WrapUnique(WidgetTest::CreateTopLevelPlatformWidget(
Widget::InitParams::CLIENT_OWNS_WIDGET));
w0->Hide();
EXPECT_TRUE(hidden);
}
class NamedWidgetShownWaiterTest : public views::test::WidgetTest {
public:
NamedWidgetShownWaiterTest() = default;
~NamedWidgetShownWaiterTest() override = default;
std::unique_ptr<views::Widget> CreateNamedWidget(const std::string& name) {
auto widget = std::make_unique<Widget>();
Widget::InitParams params =
CreateParams(Widget::InitParams::CLIENT_OWNS_WIDGET,
Widget::InitParams::TYPE_WINDOW);
params.native_widget = views::test::CreatePlatformNativeWidgetImpl(
widget.get(), views::test::kStubCapture, nullptr);
params.name = name;
widget->Init(std::move(params));
return widget;
}
};
TEST_F(NamedWidgetShownWaiterTest, ShownAfterWait) {
views::NamedWidgetShownWaiter waiter(views::test::AnyWidgetTestPasskey{},
"TestWidget");
std::unique_ptr<Widget> w0 = CreateNamedWidget("TestWidget");
base::SingleThreadTaskRunner::GetCurrentDefault()->PostTask(
FROM_HERE, base::BindOnce([](views::Widget* widget) { widget->Show(); },
base::Unretained(w0.get())));
EXPECT_EQ(waiter.WaitIfNeededAndGet(), w0.get());
}
TEST_F(NamedWidgetShownWaiterTest, ShownBeforeWait) {
views::NamedWidgetShownWaiter waiter(views::test::AnyWidgetTestPasskey{},
"TestWidget");
std::unique_ptr<Widget> w0 = CreateNamedWidget("TestWidget");
w0->Show();
EXPECT_EQ(waiter.WaitIfNeededAndGet(), w0.get());
}
TEST_F(NamedWidgetShownWaiterTest, ShownInactive) {
views::NamedWidgetShownWaiter waiter(views::test::AnyWidgetTestPasskey{},
"TestWidget");
std::unique_ptr<Widget> w0 = CreateNamedWidget("TestWidget");
w0->ShowInactive();
EXPECT_EQ(waiter.WaitIfNeededAndGet(), w0.get());
}
TEST_F(NamedWidgetShownWaiterTest, OtherWidgetShown) {
views::NamedWidgetShownWaiter waiter(views::test::AnyWidgetTestPasskey{},
"TestWidget");
std::unique_ptr<Widget> w0 = CreateNamedWidget("NotTestWidget");
std::unique_ptr<Widget> w1 = CreateNamedWidget("TestWidget");
w0->Show();
w1->Show();
EXPECT_EQ(waiter.WaitIfNeededAndGet(), w1.get());
}
} // namespace