Commit 6a6b8fd7 authored by Peter Kasting's avatar Peter Kasting Committed by Commit Bot

Host CreateTestWidget() to ViewsTestBase and use it in a few places.

Still many, many more to convert.

Bug: 1056332
Change-Id: I19d411d7583031779bad0a8ff4da4699df6df284
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2080046Reviewed-by: default avatarLeonard Grey <lgrey@chromium.org>
Reviewed-by: default avatarScott Violet <sky@chromium.org>
Reviewed-by: default avatarRobert Liao <robliao@chromium.org>
Commit-Queue: Peter Kasting <pkasting@chromium.org>
Cr-Commit-Position: refs/heads/master@{#745681}
parent 879b222e
......@@ -12,13 +12,3 @@ void ChromeViewsTestBase::SetUp() {
set_views_delegate(std::make_unique<ChromeTestViewsDelegate>());
views::ViewsTestBase::SetUp();
}
std::unique_ptr<views::Widget> ChromeViewsTestBase::CreateTestWidget(
views::Widget::InitParams::Type type) {
auto widget = std::make_unique<views::Widget>();
views::Widget::InitParams params = CreateParams(type);
params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
params.bounds = gfx::Rect(0, 0, 400, 400);
widget->Init(std::move(params));
return widget;
}
......@@ -39,10 +39,6 @@ class ChromeViewsTestBase : public views::ViewsTestBase {
// views::ViewsTestBase:
void SetUp() override;
std::unique_ptr<views::Widget> CreateTestWidget(
views::Widget::InitParams::Type type =
views::Widget::InitParams::TYPE_WINDOW_FRAMELESS);
protected:
// Use this protected member directly to drive tasks posted within a
// ChromeViewsTestBase-based test.
......
......@@ -69,8 +69,15 @@ DOM::Node* FindNodeWithID(int id, DOM::Node* root) {
class DOMAgentTest : public views::ViewsTestBase {
public:
DOMAgentTest() {}
~DOMAgentTest() override {}
DOMAgentTest() = default;
~DOMAgentTest() override = default;
views::Widget::InitParams CreateParams(
views::Widget::InitParams::Type type) override {
views::Widget::InitParams params = views::ViewsTestBase::CreateParams(type);
params.name = name_;
return params;
}
views::internal::NativeWidgetPrivate* CreateTestNativeWidget() {
views::Widget* widget = new views::Widget;
......@@ -83,20 +90,10 @@ class DOMAgentTest : public views::ViewsTestBase {
return widget->native_widget_private();
}
std::unique_ptr<views::Widget> CreateTestWidget(
const gfx::Rect& bounds,
const std::string* name = nullptr) {
auto widget = std::make_unique<views::Widget>();
views::Widget::InitParams params;
params.delegate = nullptr;
params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
params.bounds = bounds;
#if defined(USE_AURA)
params.parent = GetContext();
#endif
if (name)
params.name = *name;
widget->Init(std::move(params));
std::unique_ptr<views::Widget> CreateNamedWidget(const std::string& name) {
name_ = name;
std::unique_ptr<views::Widget> widget = CreateTestWidget();
name_.clear();
widget->Show();
return widget;
}
......@@ -263,6 +260,7 @@ class DOMAgentTest : public views::ViewsTestBase {
std::unique_ptr<DOMAgentViews> dom_agent_;
std::unique_ptr<CSSAgent> css_agent_;
std::unique_ptr<OverlayAgentViews> overlay_agent_;
std::string name_;
DISALLOW_COPY_AND_ASSIGN(DOMAgentTest);
};
......@@ -276,8 +274,7 @@ TEST_F(DOMAgentTest, GetDocumentWithWindowWidgetView) {
// (root/content views)
// child_view
// child_window
std::unique_ptr<views::Widget> widget(
CreateTestWidget(gfx::Rect(1, 1, 80, 80)));
std::unique_ptr<views::Widget> widget = CreateTestWidget();
aura::Window* parent_window = widget->GetNativeWindow();
parent_window->SetName("parent_window");
std::unique_ptr<aura::Window> child_window = CreateChildWindow(parent_window);
......@@ -330,10 +327,8 @@ TEST_F(DOMAgentTest, GetDocumentMultipleWidgets) {
// child_b12
// child_b121
// child_b122
std::unique_ptr<views::Widget> widget_a(
CreateTestWidget(gfx::Rect(1, 1, 80, 80)));
std::unique_ptr<views::Widget> widget_b(
CreateTestWidget(gfx::Rect(100, 100, 80, 80)));
std::unique_ptr<views::Widget> widget_a = CreateTestWidget();
std::unique_ptr<views::Widget> widget_b = CreateTestWidget();
widget_a->GetRootView()->AddChildView(new TestView("child_a1"));
widget_a->GetRootView()->AddChildView(new TestView("child_a2"));
......@@ -459,8 +454,8 @@ TEST_F(DOMAgentTest, WindowStackingChangedChildNodeRemovedAndInserted) {
#endif // defined(USE_AURA)
TEST_F(DOMAgentTest, ViewInserted) {
std::unique_ptr<views::Widget> widget(
CreateTestWidget(gfx::Rect(1, 1, 80, 80)));
std::unique_ptr<views::Widget> widget =
CreateTestWidget(views::Widget::InitParams::TYPE_WINDOW);
widget->Show();
// Initialize DOMAgent
......@@ -475,8 +470,7 @@ TEST_F(DOMAgentTest, ViewInserted) {
}
TEST_F(DOMAgentTest, ViewRemoved) {
std::unique_ptr<views::Widget> widget(
CreateTestWidget(gfx::Rect(1, 1, 80, 80)));
std::unique_ptr<views::Widget> widget = CreateTestWidget();
widget->Show();
views::View* root_view = widget->GetRootView();
......@@ -495,8 +489,7 @@ TEST_F(DOMAgentTest, ViewRemoved) {
}
TEST_F(DOMAgentTest, ViewRearranged) {
std::unique_ptr<views::Widget> widget(
CreateTestWidget(gfx::Rect(1, 1, 80, 80)));
std::unique_ptr<views::Widget> widget = CreateTestWidget();
widget->Show();
views::View* root_view = widget->GetRootView();
......@@ -536,8 +529,7 @@ TEST_F(DOMAgentTest, ViewRearranged) {
}
TEST_F(DOMAgentTest, ViewRearrangedRemovedAndInserted) {
std::unique_ptr<views::Widget> widget(
CreateTestWidget(gfx::Rect(1, 1, 80, 80)));
std::unique_ptr<views::Widget> widget = CreateTestWidget();
widget->Show();
views::View* root_view = widget->GetRootView();
......@@ -567,8 +559,7 @@ TEST_F(DOMAgentTest, NodeIdToUIElementTest) {
// child_a111
// child_a1111
// child_a112
std::unique_ptr<views::Widget> widget(
CreateTestWidget(gfx::Rect(1, 1, 80, 80)));
std::unique_ptr<views::Widget> widget = CreateTestWidget();
widget->Show();
views::View* root_view = widget->GetRootView();
......@@ -615,10 +606,9 @@ TEST_F(DOMAgentTest, NodeIdToUIElementTest) {
// Tests to ensure dom search for native UI is working
TEST_F(DOMAgentTest, SimpleDomSearch) {
std::unique_ptr<views::Widget> widget_a(
CreateTestWidget(gfx::Rect(1, 1, 80, 80)));
widget_a->GetRootView()->AddChildView(new TestView("child_a1"));
widget_a->GetRootView()->AddChildView(new TestView("child_a2"));
std::unique_ptr<views::Widget> widget = CreateTestWidget();
widget->GetRootView()->AddChildView(new TestView("child_a1"));
widget->GetRootView()->AddChildView(new TestView("child_a2"));
std::unique_ptr<DOM::Node> root;
dom_agent()->getDocument(&root);
......@@ -643,10 +633,9 @@ TEST_F(DOMAgentTest, SimpleDomSearch) {
}
TEST_F(DOMAgentTest, ExactDomSearch) {
std::unique_ptr<views::Widget> widget_a(
CreateTestWidget(gfx::Rect(1, 1, 80, 80)));
widget_a->GetRootView()->AddChildView(new TestView("child_a"));
widget_a->GetRootView()->AddChildView(new TestView("child_aa"));
std::unique_ptr<views::Widget> widget = CreateTestWidget();
widget->GetRootView()->AddChildView(new TestView("child_a"));
widget->GetRootView()->AddChildView(new TestView("child_aa"));
std::unique_ptr<DOM::Node> root;
dom_agent()->getDocument(&root);
......@@ -678,12 +667,9 @@ TEST_F(DOMAgentTest, ExactDomSearch) {
TEST_F(DOMAgentTest, TagDomSearch) {
std::string widget_name = "TestElement";
std::unique_ptr<views::Widget> widget_a(
CreateTestWidget(gfx::Rect(1, 1, 80, 80), &widget_name));
std::unique_ptr<views::Widget> widget_b(
CreateTestWidget(gfx::Rect(1, 1, 80, 80), &widget_name));
std::unique_ptr<views::Widget> widget_c(
CreateTestWidget(gfx::Rect(1, 1, 80, 80), &widget_name));
std::unique_ptr<views::Widget> widget_a = CreateNamedWidget(widget_name);
std::unique_ptr<views::Widget> widget_b = CreateNamedWidget(widget_name);
std::unique_ptr<views::Widget> widget_c = CreateNamedWidget(widget_name);
widget_a->GetRootView()->AddChildView(new TestView("WidgetView"));
std::unique_ptr<DOM::Node> root;
......@@ -708,9 +694,8 @@ TEST_F(DOMAgentTest, TagDomSearch) {
}
TEST_F(DOMAgentTest, DomSearchForStylesPanel) {
std::unique_ptr<views::Widget> widget_a(
CreateTestWidget(gfx::Rect(1, 1, 80, 80)));
widget_a->GetRootView()->AddChildView(new TestView("child_a1"));
std::unique_ptr<views::Widget> widget = CreateTestWidget();
widget->GetRootView()->AddChildView(new TestView("child_a1"));
std::unique_ptr<DOM::Node> root;
dom_agent()->getDocument(&root);
......
......@@ -109,11 +109,11 @@ class BubbleDialogDelegateViewTest : public ViewsTestBase {
BubbleDialogDelegateViewTest() = default;
~BubbleDialogDelegateViewTest() override = default;
// Creates and shows a test widget that owns its native widget.
Widget* CreateTestWidget() {
Widget* widget = new WidgetWithNonNullThemeProvider();
Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_WINDOW);
params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
std::unique_ptr<views::Widget> CreateTestWidget(
views::Widget::InitParams::Type type =
views::Widget::InitParams::TYPE_WINDOW_FRAMELESS) override {
Widget::InitParams params = CreateParamsForTestWidget(type);
auto widget = std::make_unique<WidgetWithNonNullThemeProvider>();
widget->Init(std::move(params));
widget->Show();
return widget;
......@@ -126,7 +126,8 @@ class BubbleDialogDelegateViewTest : public ViewsTestBase {
} // namespace
TEST_F(BubbleDialogDelegateViewTest, CreateDelegate) {
std::unique_ptr<Widget> anchor_widget(CreateTestWidget());
std::unique_ptr<Widget> anchor_widget =
CreateTestWidget(Widget::InitParams::TYPE_WINDOW);
TestBubbleDialogDelegateView* bubble_delegate =
new TestBubbleDialogDelegateView(anchor_widget->GetContentsView());
bubble_delegate->set_color(SK_ColorGREEN);
......@@ -146,7 +147,8 @@ TEST_F(BubbleDialogDelegateViewTest, CreateDelegate) {
}
TEST_F(BubbleDialogDelegateViewTest, CloseAnchorWidget) {
std::unique_ptr<Widget> anchor_widget(CreateTestWidget());
std::unique_ptr<Widget> anchor_widget =
CreateTestWidget(Widget::InitParams::TYPE_WINDOW);
BubbleDialogDelegateView* bubble_delegate =
new TestBubbleDialogDelegateView(anchor_widget->GetContentsView());
// Preventing close on deactivate should not prevent closing with the anchor.
......@@ -165,7 +167,7 @@ TEST_F(BubbleDialogDelegateViewTest, CloseAnchorWidget) {
// TODO(msw): Remove activation hack to prevent bookkeeping errors in:
// aura::test::TestActivationClient::OnWindowDestroyed().
std::unique_ptr<Widget> smoke_and_mirrors_widget(CreateTestWidget());
std::unique_ptr<Widget> smoke_and_mirrors_widget = CreateTestWidget();
EXPECT_FALSE(bubble_observer.widget_closed());
// Ensure that closing the anchor widget also closes the bubble itself.
......@@ -178,9 +180,9 @@ TEST_F(BubbleDialogDelegateViewTest, CloseAnchorWidget) {
// bubble will call upon the anchor view to get its location).
TEST_F(BubbleDialogDelegateViewTest, CloseAnchorViewTest) {
// Create an anchor widget and add a view to be used as an anchor view.
std::unique_ptr<Widget> anchor_widget(CreateTestWidget());
std::unique_ptr<Widget> anchor_widget = CreateTestWidget();
std::unique_ptr<View> anchor_view(new View());
anchor_widget->GetContentsView()->AddChildView(anchor_view.get());
anchor_widget->SetContentsView(anchor_view.get());
TestBubbleDialogDelegateView* bubble_delegate =
new TestBubbleDialogDelegateView(anchor_view.get());
// Prevent flakes by avoiding closing on activation changes.
......@@ -203,7 +205,7 @@ TEST_F(BubbleDialogDelegateViewTest, CloseAnchorViewTest) {
// Remove now the anchor view and make sure that the original found rect
// is still kept, so that the bubble does not jump when the view gets deleted.
anchor_widget->GetContentsView()->RemoveChildView(anchor_view.get());
anchor_widget->SetContentsView(anchor_view.get());
anchor_view.reset();
EXPECT_EQ(nullptr, bubble_delegate->GetAnchorView());
EXPECT_EQ(view_rect.ToString(), bubble_delegate->GetAnchorRect().ToString());
......@@ -212,7 +214,8 @@ TEST_F(BubbleDialogDelegateViewTest, CloseAnchorViewTest) {
// Testing that a move of the anchor view will lead to new bubble locations.
TEST_F(BubbleDialogDelegateViewTest, TestAnchorRectMovesWithViewTest) {
// Create an anchor widget and add a view to be used as anchor view.
std::unique_ptr<Widget> anchor_widget(CreateTestWidget());
std::unique_ptr<Widget> anchor_widget =
CreateTestWidget(Widget::InitParams::TYPE_WINDOW);
TestBubbleDialogDelegateView* bubble_delegate =
new TestBubbleDialogDelegateView(anchor_widget->GetContentsView());
BubbleDialogDelegateView::CreateBubble(bubble_delegate);
......@@ -226,13 +229,14 @@ TEST_F(BubbleDialogDelegateViewTest, TestAnchorRectMovesWithViewTest) {
}
TEST_F(BubbleDialogDelegateViewTest, ResetAnchorWidget) {
std::unique_ptr<Widget> anchor_widget(CreateTestWidget());
std::unique_ptr<Widget> anchor_widget =
CreateTestWidget(Widget::InitParams::TYPE_WINDOW);
BubbleDialogDelegateView* bubble_delegate =
new TestBubbleDialogDelegateView(anchor_widget->GetContentsView());
// Make sure the bubble widget is parented to a widget other than the anchor
// widget so that closing the anchor widget does not close the bubble widget.
std::unique_ptr<Widget> parent_widget(CreateTestWidget());
std::unique_ptr<Widget> parent_widget = CreateTestWidget();
bubble_delegate->set_parent_window(parent_widget->GetNativeView());
// Preventing close on deactivate should not prevent closing with the parent.
bubble_delegate->set_close_on_deactivate(false);
......@@ -258,7 +262,7 @@ TEST_F(BubbleDialogDelegateViewTest, ResetAnchorWidget) {
// TODO(msw): Remove activation hack to prevent bookkeeping errors in:
// aura::test::TestActivationClient::OnWindowDestroyed().
std::unique_ptr<Widget> smoke_and_mirrors_widget(CreateTestWidget());
std::unique_ptr<Widget> smoke_and_mirrors_widget = CreateTestWidget();
EXPECT_FALSE(bubble_observer.widget_closed());
// Ensure that closing the parent widget also closes the bubble itself.
......@@ -267,7 +271,8 @@ TEST_F(BubbleDialogDelegateViewTest, ResetAnchorWidget) {
}
TEST_F(BubbleDialogDelegateViewTest, InitiallyFocusedView) {
std::unique_ptr<Widget> anchor_widget(CreateTestWidget());
std::unique_ptr<Widget> anchor_widget =
CreateTestWidget(Widget::InitParams::TYPE_WINDOW);
BubbleDialogDelegateView* bubble_delegate =
new TestBubbleDialogDelegateView(anchor_widget->GetContentsView());
Widget* bubble_widget =
......@@ -279,7 +284,8 @@ TEST_F(BubbleDialogDelegateViewTest, InitiallyFocusedView) {
}
TEST_F(BubbleDialogDelegateViewTest, NonClientHitTest) {
std::unique_ptr<Widget> anchor_widget(CreateTestWidget());
std::unique_ptr<Widget> anchor_widget =
CreateTestWidget(Widget::InitParams::TYPE_WINDOW);
TestBubbleDialogDelegateView* bubble_delegate =
new TestBubbleDialogDelegateView(anchor_widget->GetContentsView());
BubbleDialogDelegateView::CreateBubble(bubble_delegate);
......@@ -310,7 +316,8 @@ TEST_F(BubbleDialogDelegateViewTest, NonClientHitTest) {
}
TEST_F(BubbleDialogDelegateViewTest, VisibleWhenAnchorWidgetBoundsChanged) {
std::unique_ptr<Widget> anchor_widget(CreateTestWidget());
std::unique_ptr<Widget> anchor_widget =
CreateTestWidget(Widget::InitParams::TYPE_WINDOW);
BubbleDialogDelegateView* bubble_delegate =
new TestBubbleDialogDelegateView(anchor_widget->GetContentsView());
Widget* bubble_widget =
......@@ -327,7 +334,8 @@ TEST_F(BubbleDialogDelegateViewTest, VisibleWhenAnchorWidgetBoundsChanged) {
// Test that setting WidgetDelegate::SetCanActivate() to false makes the
// widget created via BubbleDialogDelegateView::CreateBubble() not activatable.
TEST_F(BubbleDialogDelegateViewTest, NotActivatable) {
std::unique_ptr<Widget> anchor_widget(CreateTestWidget());
std::unique_ptr<Widget> anchor_widget =
CreateTestWidget(Widget::InitParams::TYPE_WINDOW);
BubbleDialogDelegateView* bubble_delegate =
new TestBubbleDialogDelegateView(anchor_widget->GetContentsView());
bubble_delegate->SetCanActivate(false);
......@@ -339,7 +347,8 @@ TEST_F(BubbleDialogDelegateViewTest, NotActivatable) {
TEST_F(BubbleDialogDelegateViewTest, CloseMethods) {
{
std::unique_ptr<Widget> anchor_widget(CreateTestWidget());
std::unique_ptr<Widget> anchor_widget =
CreateTestWidget(Widget::InitParams::TYPE_WINDOW);
BubbleDialogDelegateView* bubble_delegate =
new TestBubbleDialogDelegateView(anchor_widget->GetContentsView());
bubble_delegate->set_close_on_deactivate(true);
......@@ -351,7 +360,8 @@ TEST_F(BubbleDialogDelegateViewTest, CloseMethods) {
}
{
std::unique_ptr<Widget> anchor_widget(CreateTestWidget());
std::unique_ptr<Widget> anchor_widget =
CreateTestWidget(Widget::InitParams::TYPE_WINDOW);
BubbleDialogDelegateView* bubble_delegate =
new TestBubbleDialogDelegateView(anchor_widget->GetContentsView());
Widget* bubble_widget =
......@@ -364,7 +374,8 @@ TEST_F(BubbleDialogDelegateViewTest, CloseMethods) {
}
{
std::unique_ptr<Widget> anchor_widget(CreateTestWidget());
std::unique_ptr<Widget> anchor_widget =
CreateTestWidget(Widget::InitParams::TYPE_WINDOW);
TestBubbleDialogDelegateView* bubble_delegate =
new TestBubbleDialogDelegateView(anchor_widget->GetContentsView());
Widget* bubble_widget =
......@@ -383,7 +394,8 @@ TEST_F(BubbleDialogDelegateViewTest, CloseMethods) {
}
TEST_F(BubbleDialogDelegateViewTest, CustomTitle) {
std::unique_ptr<Widget> anchor_widget(CreateTestWidget());
std::unique_ptr<Widget> anchor_widget =
CreateTestWidget(Widget::InitParams::TYPE_WINDOW);
TestBubbleDialogDelegateView* bubble_delegate =
new TestBubbleDialogDelegateView(anchor_widget->GetContentsView());
constexpr int kTitleHeight = 20;
......@@ -459,7 +471,8 @@ TEST_F(BubbleDialogDelegateViewTest, CustomTitle) {
// Ensure the BubbleFrameView correctly resizes when the title is provided by a
// StyledLabel.
TEST_F(BubbleDialogDelegateViewTest, StyledLabelTitle) {
std::unique_ptr<Widget> anchor_widget(CreateTestWidget());
std::unique_ptr<Widget> anchor_widget =
CreateTestWidget(Widget::InitParams::TYPE_WINDOW);
TestBubbleDialogDelegateView* bubble_delegate =
new TestBubbleDialogDelegateView(anchor_widget->GetContentsView());
StyledLabel* title_view = new StyledLabel(base::ASCIIToUTF16("123"), nullptr);
......@@ -492,9 +505,9 @@ TEST_F(BubbleDialogDelegateViewTest, StyledLabelTitle) {
// Ensure associated buttons are highlighted or unhighlighted when the bubble
// widget is shown or hidden respectively.
TEST_F(BubbleDialogDelegateViewTest, AttachedWidgetShowsInkDropWhenVisible) {
std::unique_ptr<Widget> anchor_widget(CreateTestWidget());
std::unique_ptr<Widget> anchor_widget = CreateTestWidget();
LabelButton* button = new LabelButton(nullptr, base::string16());
anchor_widget->GetContentsView()->AddChildView(button);
anchor_widget->SetContentsView(button);
TestInkDrop* ink_drop = new TestInkDrop();
test::InkDropHostViewTestApi(button).SetInkDrop(base::WrapUnique(ink_drop));
TestBubbleDialogDelegateView* bubble_delegate =
......@@ -520,9 +533,9 @@ TEST_F(BubbleDialogDelegateViewTest, AttachedWidgetShowsInkDropWhenVisible) {
// widget is shown or hidden respectively when highlighted button is set after
// widget is shown.
TEST_F(BubbleDialogDelegateViewTest, VisibleWidgetShowsInkDropOnAttaching) {
std::unique_ptr<Widget> anchor_widget(CreateTestWidget());
std::unique_ptr<Widget> anchor_widget = CreateTestWidget();
LabelButton* button = new LabelButton(nullptr, base::string16());
anchor_widget->GetContentsView()->AddChildView(button);
anchor_widget->SetContentsView(button);
TestInkDrop* ink_drop = new TestInkDrop();
test::InkDropHostViewTestApi(button).SetInkDrop(base::WrapUnique(ink_drop));
TestBubbleDialogDelegateView* bubble_delegate =
......@@ -546,7 +559,8 @@ TEST_F(BubbleDialogDelegateViewTest, VisibleWidgetShowsInkDropOnAttaching) {
}
TEST_F(BubbleDialogDelegateViewTest, VisibleAnchorChanges) {
std::unique_ptr<Widget> anchor_widget(CreateTestWidget());
std::unique_ptr<Widget> anchor_widget =
CreateTestWidget(Widget::InitParams::TYPE_WINDOW);
TestBubbleDialogDelegateView* bubble_delegate =
new TestBubbleDialogDelegateView(nullptr);
bubble_delegate->set_parent_window(anchor_widget->GetNativeView());
......@@ -568,7 +582,7 @@ TEST_F(BubbleDialogDelegateViewTest, VisibleAnchorChanges) {
}
TEST_F(BubbleDialogDelegateViewTest, GetThemeProvider_FromAnchorWidget) {
std::unique_ptr<Widget> anchor_widget(CreateTestWidget());
std::unique_ptr<Widget> anchor_widget = CreateTestWidget();
TestBubbleDialogDelegateView* bubble_delegate =
new TestBubbleDialogDelegateView(nullptr);
bubble_delegate->set_parent_window(anchor_widget->GetNativeView());
......
......@@ -137,6 +137,14 @@ Widget::InitParams ViewsTestBase::CreateParams(Widget::InitParams::Type type) {
return params;
}
std::unique_ptr<Widget> ViewsTestBase::CreateTestWidget(
Widget::InitParams::Type type) {
Widget::InitParams params = CreateParamsForTestWidget(type);
auto widget = std::make_unique<Widget>();
widget->Init(std::move(params));
return widget;
}
bool ViewsTestBase::HasCompositingManager() const {
return has_compositing_manager_;
}
......@@ -158,9 +166,8 @@ NativeWidget* ViewsTestBase::CreateNativeWidgetForTest(
#elif defined(USE_AURA)
// For widgets that have a modal parent, don't force a native widget type.
// This logic matches DesktopTestViewsDelegate as well as ChromeViewsDelegate.
if (init_params.parent &&
init_params.type != views::Widget::InitParams::TYPE_MENU &&
init_params.type != views::Widget::InitParams::TYPE_TOOLTIP) {
if (init_params.parent && init_params.type != Widget::InitParams::TYPE_MENU &&
init_params.type != Widget::InitParams::TYPE_TOOLTIP) {
// Returning null results in using the platform default, which is
// NativeWidgetAura.
return nullptr;
......@@ -184,6 +191,14 @@ NativeWidget* ViewsTestBase::CreateNativeWidgetForTest(
#endif
}
Widget::InitParams ViewsTestBase::CreateParamsForTestWidget(
Widget::InitParams::Type type) {
Widget::InitParams params = CreateParams(type);
params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
params.bounds = gfx::Rect(0, 0, 400, 400);
return params;
}
void ViewsTestBaseWithNativeWidgetType::SetUp() {
set_native_widget_type(GetParam());
ViewsTestBase::SetUp();
......
......@@ -79,6 +79,10 @@ class ViewsTestBase : public PlatformTest {
// cross-platform tests.
virtual Widget::InitParams CreateParams(Widget::InitParams::Type type);
virtual std::unique_ptr<Widget> CreateTestWidget(
Widget::InitParams::Type type =
Widget::InitParams::TYPE_WINDOW_FRAMELESS);
bool HasCompositingManager() const;
// Simulate an OS-level destruction of the native window held by |widget|.
......@@ -124,6 +128,10 @@ class ViewsTestBase : public PlatformTest {
internal::NativeWidgetDelegate* delegate);
protected:
Widget::InitParams CreateParamsForTestWidget(
Widget::InitParams::Type type =
Widget::InitParams::TYPE_WINDOW_FRAMELESS);
// Initialized first, destroyed last. Use this protected member directly from
// the test body to drive tasks posted within a ViewsTestBase-based test.
base::Optional<base::test::TaskEnvironment> task_environment_;
......
......@@ -173,15 +173,20 @@ TEST_F(WidgetTest, WidgetInitParams) {
// Tests that the internal name is propagated through widget initialization to
// the native widget and back.
TEST_F(WidgetTest, GetName) {
Widget widget;
Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_WINDOW);
params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
params.name = "MyWidget";
widget.Init(std::move(params));
class WidgetNameTest : public WidgetTest {
public:
Widget::InitParams CreateParams(Widget::InitParams::Type type) override {
Widget::InitParams params = WidgetTest::CreateParams(type);
params.name = "MyWidget";
return params;
}
};
EXPECT_EQ("MyWidget", widget.native_widget_private()->GetName());
EXPECT_EQ("MyWidget", widget.GetName());
TEST_F(WidgetNameTest, GetName) {
std::unique_ptr<Widget> widget = CreateTestWidget();
EXPECT_EQ("MyWidget", widget->native_widget_private()->GetName());
EXPECT_EQ("MyWidget", widget->GetName());
}
TEST_F(WidgetTest, NativeWindowProperty) {
......@@ -343,11 +348,10 @@ class OwnershipTestWidget : public Widget {
TEST_F(WidgetOwnershipTest, Ownership_WidgetOwnsPlatformNativeWidget) {
OwnershipTestState state;
std::unique_ptr<Widget> widget(new OwnershipTestWidget(&state));
Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_POPUP);
auto widget = std::make_unique<OwnershipTestWidget>(&state);
Widget::InitParams params = CreateParamsForTestWidget();
params.native_widget = CreatePlatformNativeWidgetImpl(
params, widget.get(), kStubCapture, &state.native_widget_deleted);
params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
widget->Init(std::move(params));
// Now delete the Widget, which should delete the NativeWidget.
......@@ -364,11 +368,10 @@ TEST_F(WidgetOwnershipTest, Ownership_WidgetOwnsPlatformNativeWidget) {
TEST_F(WidgetOwnershipTest, Ownership_WidgetOwnsViewsNativeWidget) {
OwnershipTestState state;
std::unique_ptr<Widget> widget(new OwnershipTestWidget(&state));
Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_POPUP);
auto widget = std::make_unique<OwnershipTestWidget>(&state);
Widget::InitParams params = CreateParamsForTestWidget();
params.native_widget = CreatePlatformNativeWidgetImpl(
params, widget.get(), kStubCapture, &state.native_widget_deleted);
params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
widget->Init(std::move(params));
// Now delete the Widget, which should delete the NativeWidget.
......@@ -389,12 +392,11 @@ TEST_F(WidgetOwnershipTest,
Widget* toplevel = CreateTopLevelPlatformWidget();
std::unique_ptr<Widget> widget(new OwnershipTestWidget(&state));
Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_POPUP);
auto widget = std::make_unique<OwnershipTestWidget>(&state);
Widget::InitParams params = CreateParamsForTestWidget();
params.parent = toplevel->GetNativeView();
params.native_widget = CreatePlatformNativeWidgetImpl(
params, widget.get(), kStubCapture, &state.native_widget_deleted);
params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
widget->Init(std::move(params));
// Now close the toplevel, which deletes the view hierarchy.
......@@ -534,11 +536,10 @@ TEST_F(WidgetOwnershipTest,
WidgetDelegateView* delegate_view = new WidgetDelegateView;
std::unique_ptr<Widget> widget(new OwnershipTestWidget(&state));
Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_POPUP);
auto widget = std::make_unique<OwnershipTestWidget>(&state);
Widget::InitParams params = CreateParamsForTestWidget();
params.native_widget = CreatePlatformNativeWidgetImpl(
params, widget.get(), kStubCapture, &state.native_widget_deleted);
params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
params.delegate = delegate_view;
widget->Init(std::move(params));
widget->SetContentsView(delegate_view);
......@@ -557,56 +558,53 @@ TEST_F(WidgetOwnershipTest,
using WidgetWithDestroyedNativeViewTest = ViewsTestBaseWithNativeWidgetType;
TEST_P(WidgetWithDestroyedNativeViewTest, Test) {
Widget widget;
Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_POPUP);
params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
widget.Init(std::move(params));
widget.Show();
std::unique_ptr<Widget> widget = CreateTestWidget();
widget->Show();
widget.native_widget_private()->CloseNow();
widget.GetNativeView();
widget.GetNativeWindow();
widget->native_widget_private()->CloseNow();
widget->GetNativeView();
widget->GetNativeWindow();
ui::Accelerator accelerator;
widget.GetAccelerator(0, &accelerator);
widget.GetTopLevelWidget();
widget.GetWindowBoundsInScreen();
widget.GetClientAreaBoundsInScreen();
widget.SetBounds(gfx::Rect(0, 0, 100, 80));
widget.SetSize(gfx::Size(10, 11));
widget.SetBoundsConstrained(gfx::Rect(0, 0, 120, 140));
widget.SetVisibilityChangedAnimationsEnabled(false);
widget.StackAtTop();
widget.IsClosed();
widget.Close();
widget.Hide();
widget.Activate();
widget.Deactivate();
widget.IsActive();
widget.SetZOrderLevel(ui::ZOrderLevel::kNormal);
widget.GetZOrderLevel();
widget.Maximize();
widget.Minimize();
widget.Restore();
widget.IsMaximized();
widget.IsFullscreen();
widget.SetOpacity(0.f);
widget.FlashFrame(true);
widget.IsVisible();
widget.GetThemeProvider();
widget.GetNativeTheme();
widget.GetFocusManager();
widget.SchedulePaintInRect(gfx::Rect(0, 0, 1, 2));
widget.IsMouseEventsEnabled();
widget.SetNativeWindowProperty("xx", &widget);
widget.GetNativeWindowProperty("xx");
widget.GetFocusTraversable();
widget.GetLayer();
widget.ReorderNativeViews();
widget.SetCapture(widget.GetRootView());
widget.ReleaseCapture();
widget.HasCapture();
widget.GetWorkAreaBoundsInScreen();
widget.IsTranslucentWindowOpacitySupported();
widget->GetAccelerator(0, &accelerator);
widget->GetTopLevelWidget();
widget->GetWindowBoundsInScreen();
widget->GetClientAreaBoundsInScreen();
widget->SetBounds(gfx::Rect(0, 0, 100, 80));
widget->SetSize(gfx::Size(10, 11));
widget->SetBoundsConstrained(gfx::Rect(0, 0, 120, 140));
widget->SetVisibilityChangedAnimationsEnabled(false);
widget->StackAtTop();
widget->IsClosed();
widget->Close();
widget->Hide();
widget->Activate();
widget->Deactivate();
widget->IsActive();
widget->SetZOrderLevel(ui::ZOrderLevel::kNormal);
widget->GetZOrderLevel();
widget->Maximize();
widget->Minimize();
widget->Restore();
widget->IsMaximized();
widget->IsFullscreen();
widget->SetOpacity(0.f);
widget->FlashFrame(true);
widget->IsVisible();
widget->GetThemeProvider();
widget->GetNativeTheme();
widget->GetFocusManager();
widget->SchedulePaintInRect(gfx::Rect(0, 0, 1, 2));
widget->IsMouseEventsEnabled();
widget->SetNativeWindowProperty("xx", &widget);
widget->GetNativeWindowProperty("xx");
widget->GetFocusTraversable();
widget->GetLayer();
widget->ReorderNativeViews();
widget->SetCapture(widget->GetRootView());
widget->ReleaseCapture();
widget->HasCapture();
widget->GetWorkAreaBoundsInScreen();
widget->IsTranslucentWindowOpacitySupported();
}
INSTANTIATE_TEST_SUITE_P(
......@@ -1268,15 +1266,10 @@ TEST_F(DesktopWidgetTest, DISABLED_FocusChangesOnBubble) {
// Create a widget, show and activate it and focus the contents view.
View* contents_view = new View;
contents_view->SetFocusBehavior(View::FocusBehavior::ALWAYS);
Widget widget;
Widget::InitParams init_params =
CreateParams(Widget::InitParams::TYPE_WINDOW_FRAMELESS);
init_params.bounds = gfx::Rect(0, 0, 200, 200);
init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
widget.Init(std::move(init_params));
widget.SetContentsView(contents_view);
widget.Show();
widget.Activate();
std::unique_ptr<Widget> widget = CreateTestWidget();
widget->SetContentsView(contents_view);
widget->Show();
widget->Activate();
contents_view->RequestFocus();
EXPECT_TRUE(contents_view->HasFocus());
......@@ -1319,22 +1312,16 @@ TEST_F(WidgetTest, BubbleControlsResetOnInit) {
// size while minimized.
TEST_F(DesktopWidgetTest, TestViewWidthAfterMinimizingWidget) {
// Create a widget.
Widget widget;
Widget::InitParams init_params =
CreateParams(Widget::InitParams::TYPE_WINDOW);
init_params.show_state = ui::SHOW_STATE_NORMAL;
gfx::Rect initial_bounds(0, 0, 300, 400);
init_params.bounds = initial_bounds;
init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
widget.Init(std::move(init_params));
NonClientView* non_client_view = widget.non_client_view();
NonClientFrameView* frame_view = new MinimumSizeFrameView(&widget);
std::unique_ptr<Widget> widget =
CreateTestWidget(Widget::InitParams::TYPE_WINDOW);
NonClientView* non_client_view = widget->non_client_view();
NonClientFrameView* frame_view = new MinimumSizeFrameView(widget.get());
non_client_view->SetFrameView(frame_view);
// Setting the frame view doesn't do a layout, so force one.
non_client_view->Layout();
widget.Show();
widget->Show();
EXPECT_NE(0, frame_view->width());
widget.Minimize();
widget->Minimize();
EXPECT_EQ(0, frame_view->width());
}
#endif
......@@ -1345,16 +1332,12 @@ TEST_F(DesktopWidgetTest, TestViewWidthAfterMinimizingWidget) {
// paints are expected.
class DesktopAuraTestValidPaintWidget : public Widget, public WidgetObserver {
public:
DesktopAuraTestValidPaintWidget() { AddObserver(this); }
~DesktopAuraTestValidPaintWidget() override { RemoveObserver(this); }
DesktopAuraTestValidPaintWidget() { observer_.Add(this); }
void InitForTest(Widget::InitParams create_params);
~DesktopAuraTestValidPaintWidget() override = default;
bool ReadReceivedPaintAndReset() {
bool result = received_paint_;
received_paint_ = false;
return result;
return std::exchange(received_paint_, false);
}
bool received_paint_while_hidden() const {
......@@ -1392,73 +1375,79 @@ class DesktopAuraTestValidPaintWidget : public Widget, public WidgetObserver {
bool expect_paint_ = true;
bool received_paint_while_hidden_ = false;
base::OnceClosure quit_closure_;
ScopedObserver<Widget, WidgetObserver> observer_{this};
DISALLOW_COPY_AND_ASSIGN(DesktopAuraTestValidPaintWidget);
};
void DesktopAuraTestValidPaintWidget::InitForTest(InitParams init_params) {
init_params.bounds = gfx::Rect(0, 0, 200, 200);
init_params.ownership = InitParams::WIDGET_OWNS_NATIVE_WIDGET;
Init(std::move(init_params));
class DesktopAuraPaintWidgetTest : public DesktopWidgetTest {
public:
std::unique_ptr<views::Widget> CreateTestWidget(
views::Widget::InitParams::Type type =
views::Widget::InitParams::TYPE_WINDOW_FRAMELESS) override {
Widget::InitParams params = CreateParamsForTestWidget(type);
auto widget = std::make_unique<DesktopAuraTestValidPaintWidget>();
paint_widget_ = widget.get();
widget->Init(std::move(params));
View* contents_view = new View;
contents_view->SetFocusBehavior(View::FocusBehavior::ALWAYS);
widget->SetContentsView(contents_view);
View* contents_view = new View;
contents_view->SetFocusBehavior(View::FocusBehavior::ALWAYS);
SetContentsView(contents_view);
widget->Show();
widget->Activate();
Show();
Activate();
}
return widget;
}
TEST_F(DesktopWidgetTest, DesktopNativeWidgetNoPaintAfterCloseTest) {
DesktopAuraTestValidPaintWidget widget;
widget.InitForTest(CreateParams(Widget::InitParams::TYPE_WINDOW_FRAMELESS));
widget.WaitUntilPaint();
EXPECT_TRUE(widget.ReadReceivedPaintAndReset());
widget.SchedulePaintInRect(widget.GetRestoredBounds());
widget.Close();
DesktopAuraTestValidPaintWidget* paint_widget() { return paint_widget_; }
private:
DesktopAuraTestValidPaintWidget* paint_widget_ = nullptr;
};
TEST_F(DesktopAuraPaintWidgetTest, DesktopNativeWidgetNoPaintAfterCloseTest) {
std::unique_ptr<Widget> widget = CreateTestWidget();
paint_widget()->WaitUntilPaint();
EXPECT_TRUE(paint_widget()->ReadReceivedPaintAndReset());
widget->SchedulePaintInRect(widget->GetRestoredBounds());
widget->Close();
RunPendingMessages();
EXPECT_FALSE(widget.ReadReceivedPaintAndReset());
EXPECT_FALSE(widget.received_paint_while_hidden());
EXPECT_FALSE(paint_widget()->ReadReceivedPaintAndReset());
EXPECT_FALSE(paint_widget()->received_paint_while_hidden());
}
TEST_F(DesktopWidgetTest, DesktopNativeWidgetNoPaintAfterHideTest) {
DesktopAuraTestValidPaintWidget widget;
widget.InitForTest(CreateParams(Widget::InitParams::TYPE_WINDOW_FRAMELESS));
widget.WaitUntilPaint();
EXPECT_TRUE(widget.ReadReceivedPaintAndReset());
widget.SchedulePaintInRect(widget.GetRestoredBounds());
widget.Hide();
TEST_F(DesktopAuraPaintWidgetTest, DesktopNativeWidgetNoPaintAfterHideTest) {
std::unique_ptr<Widget> widget = CreateTestWidget();
paint_widget()->WaitUntilPaint();
EXPECT_TRUE(paint_widget()->ReadReceivedPaintAndReset());
widget->SchedulePaintInRect(widget->GetRestoredBounds());
widget->Hide();
RunPendingMessages();
EXPECT_FALSE(widget.ReadReceivedPaintAndReset());
EXPECT_FALSE(widget.received_paint_while_hidden());
widget.Close();
EXPECT_FALSE(paint_widget()->ReadReceivedPaintAndReset());
EXPECT_FALSE(paint_widget()->received_paint_while_hidden());
widget->Close();
}
// Test to ensure that the aura Window's visiblity state is set to visible if
// Test to ensure that the aura Window's visibility state is set to visible if
// the underlying widget is hidden and then shown.
TEST_F(DesktopWidgetTest, TestWindowVisibilityAfterHide) {
// Create a widget.
Widget widget;
Widget::InitParams init_params =
CreateParams(Widget::InitParams::TYPE_WINDOW);
init_params.show_state = ui::SHOW_STATE_NORMAL;
gfx::Rect initial_bounds(0, 0, 300, 400);
init_params.bounds = initial_bounds;
init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
widget.Init(std::move(init_params));
NonClientView* non_client_view = widget.non_client_view();
NonClientFrameView* frame_view = new MinimumSizeFrameView(&widget);
std::unique_ptr<Widget> widget =
CreateTestWidget(Widget::InitParams::TYPE_WINDOW);
NonClientView* non_client_view = widget->non_client_view();
NonClientFrameView* frame_view = new MinimumSizeFrameView(widget.get());
non_client_view->SetFrameView(frame_view);
widget.Show();
EXPECT_TRUE(IsNativeWindowVisible(widget.GetNativeWindow()));
widget.Hide();
EXPECT_FALSE(IsNativeWindowVisible(widget.GetNativeWindow()));
widget.Show();
EXPECT_TRUE(IsNativeWindowVisible(widget.GetNativeWindow()));
widget->Show();
EXPECT_TRUE(IsNativeWindowVisible(widget->GetNativeWindow()));
widget->Hide();
EXPECT_FALSE(IsNativeWindowVisible(widget->GetNativeWindow()));
widget->Show();
EXPECT_TRUE(IsNativeWindowVisible(widget->GetNativeWindow()));
}
// Tests that wheel events generated from scroll events are targetted to the
// Tests that wheel events generated from scroll events are targeted to the
// views under the cursor when the focused view does not processed them.
TEST_F(WidgetTest, WheelEventsFromScrollEventTarget) {
EventCountView* cursor_view = new EventCountView;
......@@ -1956,9 +1945,7 @@ void TestNativeWidgetDestroyedWidget::OnNativeWidgetDestroyed() {
// crash in ASan.
TEST_F(DesktopWidgetTest, WidgetDestroyedItselfDoesNotCrash) {
TestDesktopWidgetDelegate delegate(new TestNativeWidgetDestroyedWidget);
Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_WINDOW);
params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
delegate.InitWidget(std::move(params));
delegate.InitWidget(CreateParamsForTestWidget());
delegate.GetWidget()->Show();
delegate.GetWidget()->CloseNow();
}
......@@ -2248,11 +2235,7 @@ TEST_F(DesktopWidgetTest, CloseDestroys) {
// Tests that killing a widget while animating it does not crash.
TEST_F(WidgetTest, CloseWidgetWhileAnimating) {
std::unique_ptr<Widget> widget(new Widget);
Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_POPUP);
params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
params.bounds = gfx::Rect(50, 50, 250, 250);
widget->Init(std::move(params));
std::unique_ptr<Widget> widget = CreateTestWidget();
AnimationEndObserver animation_observer;
WidgetBoundsObserver widget_observer;
gfx::Rect bounds(100, 100, 50, 50);
......@@ -2326,28 +2309,17 @@ TEST_F(DesktopWidgetTest, ValidDuringOnNativeWidgetDestroyingFromClose) {
// Tests that we do not crash when a Widget is destroyed by going out of
// scope (as opposed to being explicitly deleted by its NativeWidget).
TEST_F(WidgetTest, NoCrashOnWidgetDelete) {
std::unique_ptr<Widget> widget(new Widget);
Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_POPUP);
params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
widget->Init(std::move(params));
CreateTestWidget();
}
TEST_F(WidgetTest, NoCrashOnResizeConstraintsWindowTitleOnPopup) {
std::unique_ptr<Widget> widget(new Widget);
Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_POPUP);
params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
widget->Init(std::move(params));
widget->OnSizeConstraintsChanged();
CreateTestWidget(Widget::InitParams::TYPE_POPUP)->OnSizeConstraintsChanged();
}
// Tests that we do not crash when a Widget is destroyed before it finishes
// processing of pending input events in the message loop.
TEST_F(WidgetTest, NoCrashOnWidgetDeleteWithPendingEvents) {
std::unique_ptr<Widget> widget(new Widget);
Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_WINDOW);
params.bounds = gfx::Rect(0, 0, 200, 200);
params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
widget->Init(std::move(params));
std::unique_ptr<Widget> widget = CreateTestWidget();
widget->Show();
ui::test::EventGenerator generator(GetContext(), widget->GetNativeWindow());
......@@ -3125,35 +3097,19 @@ TEST_F(WidgetChildDestructionTest, DestroyChildWidgetsInOrder) {
// Verifies nativeview visbility matches that of Widget visibility when
// SetFullscreen is invoked.
TEST_F(WidgetTest, FullscreenStatePropagated) {
Widget::InitParams init_params =
CreateParams(Widget::InitParams::TYPE_WINDOW);
init_params.show_state = ui::SHOW_STATE_NORMAL;
init_params.bounds = gfx::Rect(0, 0, 500, 500);
init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
Widget top_level_widget;
top_level_widget.Init(std::move(init_params));
top_level_widget.SetFullscreen(true);
EXPECT_EQ(top_level_widget.IsVisible(),
IsNativeWindowVisible(top_level_widget.GetNativeWindow()));
top_level_widget.CloseNow();
std::unique_ptr<Widget> top_level_widget = CreateTestWidget();
top_level_widget->SetFullscreen(true);
EXPECT_EQ(top_level_widget->IsVisible(),
IsNativeWindowVisible(top_level_widget->GetNativeWindow()));
}
// Verifies nativeview visbility matches that of Widget visibility when
// SetFullscreen is invoked, for a widget provided with a desktop widget.
TEST_F(DesktopWidgetTest, FullscreenStatePropagated_DesktopWidget) {
Widget::InitParams init_params =
CreateParams(Widget::InitParams::TYPE_WINDOW);
init_params.show_state = ui::SHOW_STATE_NORMAL;
init_params.bounds = gfx::Rect(0, 0, 500, 500);
init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
Widget top_level_widget;
top_level_widget.Init(std::move(init_params));
top_level_widget.SetFullscreen(true);
EXPECT_EQ(top_level_widget.IsVisible(),
IsNativeWindowVisible(top_level_widget.GetNativeWindow()));
top_level_widget.CloseNow();
std::unique_ptr<Widget> top_level_widget = CreateTestWidget();
top_level_widget->SetFullscreen(true);
EXPECT_EQ(top_level_widget->IsVisible(),
IsNativeWindowVisible(top_level_widget->GetNativeWindow()));
}
namespace {
......@@ -3230,28 +3186,38 @@ class IsActiveFromDestroyObserver : public WidgetObserver {
} // namespace
class ChildDesktopWidgetTest : public DesktopWidgetTest {
public:
Widget::InitParams CreateParams(Widget::InitParams::Type type) override {
Widget::InitParams params = DesktopWidgetTest::CreateParams(type);
if (context_)
params.context = context_;
return params;
}
std::unique_ptr<Widget> CreateChildWidget(gfx::NativeWindow context) {
context_ = context;
return CreateTestWidget();
}
private:
gfx::NativeWindow context_ = nullptr;
};
// Verifies Widget::IsActive() invoked from
// WidgetObserver::OnWidgetDestroying() in a child widget doesn't crash.
TEST_F(DesktopWidgetTest, IsActiveFromDestroy) {
TEST_F(ChildDesktopWidgetTest, IsActiveFromDestroy) {
// Create two widgets, one a child of the other.
IsActiveFromDestroyObserver observer;
Widget parent_widget;
Widget::InitParams parent_params =
CreateParams(Widget::InitParams::TYPE_POPUP);
parent_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
parent_widget.Init(std::move(parent_params));
parent_widget.Show();
Widget child_widget;
Widget::InitParams child_params =
CreateParams(Widget::InitParams::TYPE_POPUP);
child_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
child_params.context = parent_widget.GetNativeWindow();
child_widget.Init(std::move(child_params));
child_widget.AddObserver(&observer);
child_widget.Show();
parent_widget.CloseNow();
std::unique_ptr<Widget> parent_widget = CreateTestWidget();
parent_widget->Show();
std::unique_ptr<Widget> child_widget =
CreateChildWidget(parent_widget->GetNativeWindow());
child_widget->AddObserver(&observer);
child_widget->Show();
parent_widget->CloseNow();
}
// Tests that events propagate through from the dispatcher with the correct
......@@ -3419,15 +3385,12 @@ SubclassWindowHelper* SubclassWindowHelper::instance_ = nullptr;
// Disabled because of flaky timeouts: http://crbug.com/592742
TEST_F(DesktopWidgetTest,
DISABLED_SysCommandMoveOnNCLButtonDownOnCaptionAndMoveTest) {
Widget widget;
Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_WINDOW);
params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
widget.Init(std::move(params));
widget.SetBounds(gfx::Rect(0, 0, 200, 200));
widget.Show();
std::unique_ptr<Widget> widget =
CreateTestWidget(Widget::InitParams::TYPE_WINDOW);
widget->Show();
::SetCursorPos(500, 500);
HWND window = widget.GetNativeWindow()->GetHost()->GetAcceleratedWidget();
HWND window = widget->GetNativeWindow()->GetHost()->GetAcceleratedWidget();
SubclassWindowHelper subclass_helper(window);
......@@ -3482,23 +3445,18 @@ TEST_F(DesktopWidgetTest,
EXPECT_TRUE(subclass_helper.received_message(WM_NCLBUTTONDOWN));
EXPECT_TRUE(subclass_helper.received_message(WM_MOUSEMOVE));
EXPECT_TRUE(subclass_helper.received_message(WM_SYSCOMMAND));
widget.CloseNow();
}
// This test validates that destroying the window in the context of the
// WM_SYSCOMMAND message with SC_MOVE does not crash.
// Disabled because of flaky timeouts: http://crbug.com/592742
TEST_F(DesktopWidgetTest, DISABLED_DestroyInSysCommandNCLButtonDownOnCaption) {
Widget widget;
Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_WINDOW);
params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
widget.Init(std::move(params));
widget.SetBounds(gfx::Rect(0, 0, 200, 200));
widget.Show();
std::unique_ptr<Widget> widget =
CreateTestWidget(Widget::InitParams::TYPE_WINDOW);
widget->Show();
::SetCursorPos(500, 500);
HWND window = widget.GetNativeWindow()->GetHost()->GetAcceleratedWidget();
HWND window = widget->GetNativeWindow()->GetHost()->GetAcceleratedWidget();
SubclassWindowHelper subclass_helper(window);
......@@ -3512,8 +3470,6 @@ TEST_F(DesktopWidgetTest, DISABLED_DestroyInSysCommandNCLButtonDownOnCaption) {
EXPECT_TRUE(subclass_helper.received_message(WM_NCLBUTTONDOWN));
EXPECT_TRUE(subclass_helper.received_message(WM_SYSCOMMAND));
widget.CloseNow();
}
#endif
......@@ -3708,22 +3664,19 @@ class LayoutCountingView : public View {
using WidgetInvalidateLayoutTest = ViewsTestBaseWithNativeWidgetType;
TEST_P(WidgetInvalidateLayoutTest, InvalidateLayout) {
Widget widget;
Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_WINDOW);
params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
widget.Init(std::move(params));
widget.SetBounds(gfx::Rect(0, 0, 600, 600));
std::unique_ptr<Widget> widget =
CreateTestWidget(Widget::InitParams::TYPE_WINDOW);
LayoutCountingView* view =
widget.widget_delegate()->GetContentsView()->AddChildView(
widget->widget_delegate()->GetContentsView()->AddChildView(
std::make_unique<LayoutCountingView>());
view->parent()->SetLayoutManager(std::make_unique<FillLayout>());
// Force an initial Layout().
// TODO(sky): this shouldn't be necessary, adding a child view should trigger
// ScheduleLayout().
view->Layout();
widget.Show();
widget->Show();
ui::Compositor* compositor = widget.GetCompositor();
ui::Compositor* compositor = widget->GetCompositor();
ASSERT_TRUE(compositor);
compositor->ScheduleDraw();
ui::DrawWaiterForTest::WaitForCompositingEnded(compositor);
......@@ -3735,14 +3688,14 @@ TEST_P(WidgetInvalidateLayoutTest, InvalidateLayout) {
// wait for Layout() to be called.
view->set_layout_closure(run_loop.QuitClosure());
EXPECT_FALSE(ViewTestApi(view).needs_layout());
EXPECT_FALSE(ViewTestApi(widget.GetRootView()).needs_layout());
EXPECT_FALSE(ViewTestApi(widget->GetRootView()).needs_layout());
view->InvalidateLayout();
EXPECT_TRUE(ViewTestApi(view).needs_layout());
EXPECT_TRUE(ViewTestApi(widget.GetRootView()).needs_layout());
EXPECT_TRUE(ViewTestApi(widget->GetRootView()).needs_layout());
run_loop.Run();
EXPECT_EQ(1u, view->GetAndClearLayoutCount());
EXPECT_FALSE(ViewTestApi(view).needs_layout());
EXPECT_FALSE(ViewTestApi(widget.GetRootView()).needs_layout());
EXPECT_FALSE(ViewTestApi(widget->GetRootView()).needs_layout());
}
INSTANTIATE_TEST_SUITE_P(
......@@ -3921,18 +3874,10 @@ class ModalDialogDelegate : public DialogDelegateView {
// remaining top-level windows should be re-enabled.
TEST_F(DesktopWidgetTest, WindowModalOwnerDestroyedEnabledTest) {
// top_level_widget owns owner_dialog_widget which owns owned_dialog_widget.
Widget top_level_widget;
Widget owner_dialog_widget;
Widget owned_dialog_widget;
// Create the top level widget.
Widget::InitParams init_params =
CreateParams(Widget::InitParams::TYPE_WINDOW);
init_params.show_state = ui::SHOW_STATE_NORMAL;
gfx::Rect initial_bounds(0, 0, 500, 500);
init_params.bounds = initial_bounds;
init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
top_level_widget.Init(std::move(init_params));
top_level_widget.Show();
std::unique_ptr<Widget> top_level_widget = CreateTestWidget();
top_level_widget->Show();
// Create the owner modal dialog.
// owner_dialog_delegate instance will be destroyed when the dialog
......@@ -3940,12 +3885,11 @@ TEST_F(DesktopWidgetTest, WindowModalOwnerDestroyedEnabledTest) {
ModalDialogDelegate* owner_dialog_delegate =
new ModalDialogDelegate(ui::MODAL_TYPE_WINDOW);
init_params = CreateParams(Widget::InitParams::TYPE_WINDOW);
init_params.show_state = ui::SHOW_STATE_NORMAL;
init_params.bounds = gfx::Rect(100, 100, 200, 200);
init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
Widget owner_dialog_widget;
Widget::InitParams init_params =
CreateParamsForTestWidget(Widget::InitParams::TYPE_WINDOW);
init_params.delegate = owner_dialog_delegate;
init_params.parent = top_level_widget.GetNativeView();
init_params.parent = top_level_widget->GetNativeView();
init_params.native_widget =
new test::TestPlatformNativeWidget<DesktopNativeWidgetAura>(
&owner_dialog_widget, false, nullptr);
......@@ -3961,10 +3905,7 @@ TEST_F(DesktopWidgetTest, WindowModalOwnerDestroyedEnabledTest) {
ModalDialogDelegate* owned_dialog_delegate =
new ModalDialogDelegate(ui::MODAL_TYPE_WINDOW);
init_params = CreateParams(Widget::InitParams::TYPE_WINDOW);
init_params.show_state = ui::SHOW_STATE_NORMAL;
init_params.bounds = gfx::Rect(150, 150, 250, 250);
init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
Widget owned_dialog_widget;
init_params.delegate = owned_dialog_delegate;
init_params.parent = owner_dialog_widget.GetNativeView();
init_params.native_widget =
......@@ -3977,7 +3918,7 @@ TEST_F(DesktopWidgetTest, WindowModalOwnerDestroyedEnabledTest) {
owned_dialog_widget.Show();
RunPendingMessages();
HWND top_hwnd = HWNDForWidget(&top_level_widget);
HWND top_hwnd = HWNDForWidget(top_level_widget.get());
EXPECT_FALSE(!!IsWindowEnabled(owner_hwnd));
EXPECT_FALSE(!!IsWindowEnabled(top_hwnd));
......@@ -3990,7 +3931,7 @@ TEST_F(DesktopWidgetTest, WindowModalOwnerDestroyedEnabledTest) {
EXPECT_FALSE(!!IsWindow(owned_hwnd));
EXPECT_TRUE(!!IsWindowEnabled(top_hwnd));
top_level_widget.CloseNow();
top_level_widget->CloseNow();
}
#endif // defined(OS_WIN)
......@@ -3999,17 +3940,6 @@ TEST_F(DesktopWidgetTest, WindowModalOwnerDestroyedEnabledTest) {
namespace {
void InitializeWidgetForOpacity(
Widget& widget,
Widget::InitParams init_params,
const Widget::InitParams::WindowOpacity opacity) {
init_params.opacity = opacity;
init_params.show_state = ui::SHOW_STATE_NORMAL;
init_params.bounds = gfx::Rect(0, 0, 500, 500);
init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
widget.Init(std::move(init_params));
}
class CompositingWidgetTest : public DesktopWidgetTest {
public:
CompositingWidgetTest()
......@@ -4023,8 +3953,15 @@ class CompositingWidgetTest : public DesktopWidgetTest {
Widget::InitParams::TYPE_DRAG} {}
~CompositingWidgetTest() override = default;
Widget::InitParams CreateParams(Widget::InitParams::Type type) override {
Widget::InitParams params = DesktopWidgetTest::CreateParams(type);
params.opacity = opacity_;
return params;
}
void CheckAllWidgetsForOpacity(
const Widget::InitParams::WindowOpacity opacity) {
opacity_ = opacity;
for (const auto& widget_type : widget_types_) {
#if defined(OS_MACOSX)
// Tooltips are native on Mac. See NativeWidgetNSWindowBridge::Init.
......@@ -4036,8 +3973,7 @@ class CompositingWidgetTest : public DesktopWidgetTest {
if (widget_type != Widget::InitParams::TYPE_WINDOW)
continue;
#endif
Widget widget;
InitializeWidgetForOpacity(widget, CreateParams(widget_type), opacity);
std::unique_ptr<Widget> widget = CreateTestWidget(widget_type);
// Use NativeWidgetAura directly.
if (widget_type == Widget::InitParams::TYPE_WINDOW_FRAMELESS ||
......@@ -4051,21 +3987,21 @@ class CompositingWidgetTest : public DesktopWidgetTest {
// TestViewsDelegate::use_transparent_windows_ determines the result of
// kInferOpacity: assume it is false.
bool should_be_transparent =
opacity == Widget::InitParams::WindowOpacity::kTranslucent;
opacity_ == Widget::InitParams::WindowOpacity::kTranslucent;
#else
bool should_be_transparent = widget.ShouldWindowContentsBeTransparent();
bool should_be_transparent = widget->ShouldWindowContentsBeTransparent();
#endif
EXPECT_EQ(IsNativeWindowTransparent(widget.GetNativeWindow()),
EXPECT_EQ(IsNativeWindowTransparent(widget->GetNativeWindow()),
should_be_transparent);
#if defined(USE_X11)
if (HasCompositingManager() &&
(widget_type == Widget::InitParams::TYPE_DRAG ||
widget_type == Widget::InitParams::TYPE_WINDOW)) {
EXPECT_TRUE(widget.IsTranslucentWindowOpacitySupported());
EXPECT_TRUE(widget->IsTranslucentWindowOpacitySupported());
} else {
EXPECT_FALSE(widget.IsTranslucentWindowOpacitySupported());
EXPECT_FALSE(widget->IsTranslucentWindowOpacitySupported());
}
#endif
}
......@@ -4073,6 +4009,8 @@ class CompositingWidgetTest : public DesktopWidgetTest {
protected:
const std::vector<Widget::InitParams::Type> widget_types_;
Widget::InitParams::WindowOpacity opacity_ =
Widget::InitParams::WindowOpacity::kInferred;
DISALLOW_COPY_AND_ASSIGN(CompositingWidgetTest);
};
......
......@@ -17,18 +17,6 @@
namespace views {
namespace {
// Creates a control widget with the passed in parameters.
// The caller takes ownership of the returned widget.
Widget* CreateControlWidget(aura::Window* parent, const gfx::Rect& bounds) {
Widget::InitParams params(Widget::InitParams::TYPE_CONTROL);
params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
params.parent = parent;
params.bounds = bounds;
Widget* widget = new Widget();
widget->Init(std::move(params));
return widget;
}
// Sets the name of |window| and |window|'s layer to |name|.
void SetWindowAndLayerName(aura::Window* window, const std::string& name) {
window->SetName(name);
......@@ -47,13 +35,27 @@ std::string ChildWindowNamesAsString(const aura::Window& parent) {
return names;
}
using WindowReordererTest = ViewsTestBase;
class WindowReordererTest : public ViewsTestBase {
public:
Widget::InitParams CreateParams(Widget::InitParams::Type type) override {
Widget::InitParams params = ViewsTestBase::CreateParams(type);
params.parent = parent_;
return params;
}
std::unique_ptr<Widget> CreateControlWidget(aura::Window* parent) {
parent_ = parent;
return CreateTestWidget(Widget::InitParams::TYPE_CONTROL);
}
private:
aura::Window* parent_ = nullptr;
};
// Test that views with layers and views with associated windows are reordered
// according to the view hierarchy.
TEST_F(WindowReordererTest, Basic) {
std::unique_ptr<Widget> parent(
CreateControlWidget(root_window(), gfx::Rect(0, 0, 100, 100)));
std::unique_ptr<Widget> parent = CreateControlWidget(root_window());
parent->Show();
aura::Window* parent_window = parent->GetNativeWindow();
......@@ -68,12 +70,10 @@ TEST_F(WindowReordererTest, Basic) {
v->layer()->SetName("v");
contents_view->AddChildView(v);
std::unique_ptr<Widget> w1(
CreateControlWidget(parent_window, gfx::Rect(0, 1, 100, 101)));
std::unique_ptr<Widget> w1 = CreateControlWidget(parent_window);
SetWindowAndLayerName(w1->GetNativeView(), "w1");
w1->Show();
std::unique_ptr<Widget> w2(
CreateControlWidget(parent_window, gfx::Rect(0, 2, 100, 102)));
std::unique_ptr<Widget> w2 = CreateControlWidget(parent_window);
SetWindowAndLayerName(w2->GetNativeView(), "w2");
w2->Show();
......@@ -130,8 +130,7 @@ TEST_F(WindowReordererTest, Basic) {
// - associating the "host" view and window
// all correctly reorder the child windows and layers.
TEST_F(WindowReordererTest, Association) {
std::unique_ptr<Widget> parent(
CreateControlWidget(root_window(), gfx::Rect(0, 0, 100, 100)));
std::unique_ptr<Widget> parent = CreateControlWidget(root_window());
parent->Show();
aura::Window* parent_window = parent->GetNativeWindow();
......@@ -190,8 +189,7 @@ TEST_F(WindowReordererTest, Association) {
// view and the parent layer of the associated window are different. Test that
// the layers and windows are properly reordered in this case.
TEST_F(WindowReordererTest, HostViewParentHasLayer) {
std::unique_ptr<Widget> parent(
CreateControlWidget(root_window(), gfx::Rect(0, 0, 100, 100)));
std::unique_ptr<Widget> parent = CreateControlWidget(root_window());
parent->Show();
aura::Window* parent_window = parent->GetNativeWindow();
......@@ -216,8 +214,7 @@ TEST_F(WindowReordererTest, HostViewParentHasLayer) {
v11->layer()->SetName("v11");
v1->AddChildView(v11);
std::unique_ptr<Widget> w(
CreateControlWidget(parent_window, gfx::Rect(0, 1, 100, 101)));
std::unique_ptr<Widget> w = CreateControlWidget(parent_window);
SetWindowAndLayerName(w->GetNativeView(), "w");
w->Show();
......@@ -261,8 +258,7 @@ TEST_F(WindowReordererTest, HostViewParentHasLayer) {
// Test that a layer added beneath a view is restacked correctly.
TEST_F(WindowReordererTest, ViewWithLayerBeneath) {
std::unique_ptr<Widget> parent(
CreateControlWidget(root_window(), gfx::Rect(0, 0, 100, 100)));
std::unique_ptr<Widget> parent = CreateControlWidget(root_window());
parent->Show();
aura::Window* parent_window = parent->GetNativeWindow();
......@@ -285,8 +281,7 @@ TEST_F(WindowReordererTest, ViewWithLayerBeneath) {
// Add a hosted window to make WindowReorderer::ReorderChildWindows() restack
// layers.
std::unique_ptr<Widget> child_widget(
CreateControlWidget(parent_window, gfx::Rect(gfx::Rect(0, 0, 50, 50))));
std::unique_ptr<Widget> child_widget = CreateControlWidget(parent_window);
SetWindowAndLayerName(child_widget->GetNativeView(), "child_widget");
child_widget->Show();
View* host_view = contents_view->AddChildView(std::make_unique<View>());
......
......@@ -92,12 +92,8 @@ class DialogTest : public ViewsTestBase {
// These tests all expect to use a custom frame on the dialog so they can
// control hit-testing and other behavior. Custom frames are only supported
// with a parent widget, so create the parent widget here.
views::Widget::InitParams params =
CreateParams(views::Widget::InitParams::TYPE_WINDOW);
params.bounds = gfx::Rect(10, 11, 200, 200);
params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
parent_widget_.Init(std::move(params));
parent_widget_.Show();
parent_widget_ = CreateTestWidget();
parent_widget_->Show();
InitializeDialog();
ShowDialog();
......@@ -105,7 +101,7 @@ class DialogTest : public ViewsTestBase {
void TearDown() override {
dialog_->TearDown();
parent_widget_.Close();
parent_widget_.reset();
ViewsTestBase::TearDown();
}
......@@ -126,7 +122,7 @@ class DialogTest : public ViewsTestBase {
views::Widget* CreateDialogWidget(DialogDelegate* dialog) {
views::Widget* widget = DialogDelegate::CreateDialogWidget(
dialog, GetContext(), parent_widget_.GetNativeView());
dialog, GetContext(), parent_widget_->GetNativeView());
return widget;
}
......@@ -139,7 +135,7 @@ class DialogTest : public ViewsTestBase {
}
TestDialog* dialog() const { return dialog_; }
views::Widget* parent_widget() { return &parent_widget_; }
views::Widget* parent_widget() { return parent_widget_.get(); }
protected:
bool accepted_ = false;
......@@ -147,7 +143,7 @@ class DialogTest : public ViewsTestBase {
bool closed_ = false;
private:
views::Widget parent_widget_;
std::unique_ptr<views::Widget> parent_widget_;
TestDialog* dialog_ = nullptr;
DISALLOW_COPY_AND_ASSIGN(DialogTest);
......
......@@ -12,8 +12,6 @@
namespace views {
namespace test {
using NonClientViewTest = ViewsTestBase;
namespace {
class NonClientFrameTestView : public NativeFrameView {
......@@ -58,18 +56,24 @@ class TestWidgetDelegate : public WidgetDelegateView {
}
};
class NonClientViewTest : public ViewsTestBase {
public:
Widget::InitParams CreateParams(Widget::InitParams::Type type) override {
Widget::InitParams params = ViewsTestBase::CreateParams(type);
params.delegate = new TestWidgetDelegate;
return params;
}
};
} // namespace
// Ensure Layout() is not called excessively on a ClientView when Widget bounds
// are changing.
TEST_F(NonClientViewTest, OnlyLayoutChildViewsOnce) {
Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_WINDOW);
params.delegate = new TestWidgetDelegate;
params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
views::Widget widget;
widget.Init(std::move(params));
std::unique_ptr<views::Widget> widget =
CreateTestWidget(Widget::InitParams::TYPE_WINDOW);
NonClientView* non_client_view = widget.non_client_view();
NonClientView* non_client_view = widget->non_client_view();
non_client_view->Layout();
auto* frame_view =
......@@ -86,7 +90,7 @@ TEST_F(NonClientViewTest, OnlyLayoutChildViewsOnce) {
EXPECT_EQ(client_view->layout_count(), initial_client_view_layouts);
// Ensure changing bounds triggers a (single) layout.
widget.SetBounds(gfx::Rect(0, 0, 161, 100));
widget->SetBounds(gfx::Rect(0, 0, 161, 100));
EXPECT_EQ(frame_view->layout_count(), initial_frame_view_layouts + 1);
EXPECT_EQ(client_view->layout_count(), initial_client_view_layouts + 1);
}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment