diff options
Diffstat (limited to 'chromium/ui/views/widget/native_widget_aura_unittest.cc')
-rw-r--r-- | chromium/ui/views/widget/native_widget_aura_unittest.cc | 169 |
1 files changed, 103 insertions, 66 deletions
diff --git a/chromium/ui/views/widget/native_widget_aura_unittest.cc b/chromium/ui/views/widget/native_widget_aura_unittest.cc index 4ddad6d7a06..5bd2526da57 100644 --- a/chromium/ui/views/widget/native_widget_aura_unittest.cc +++ b/chromium/ui/views/widget/native_widget_aura_unittest.cc @@ -5,6 +5,7 @@ #include "ui/views/widget/native_widget_aura.h" #include <memory> +#include <utility> #include "base/command_line.h" #include "base/macros.h" @@ -33,7 +34,7 @@ namespace { NativeWidgetAura* Init(aura::Window* parent, Widget* widget) { Widget::InitParams params(Widget::InitParams::TYPE_POPUP); - params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; + params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; params.parent = parent; widget->Init(std::move(params)); return static_cast<NativeWidgetAura*>(widget->native_widget()); @@ -97,9 +98,7 @@ TEST_F(NativeWidgetAuraTest, CenterWindowLargeParent) { NativeWidgetAura* window = Init(parent.get(), widget.get()); window->CenterWindow(gfx::Size(100, 100)); - EXPECT_EQ(gfx::Rect((640 - 100) / 2, - (480 - 100) / 2, - 100, 100), + EXPECT_EQ(gfx::Rect((640 - 100) / 2, (480 - 100) / 2, 100, 100), window->GetNativeWindow()->bounds()); widget->CloseNow(); } @@ -114,9 +113,7 @@ TEST_F(NativeWidgetAuraTest, CenterWindowSmallParent) { NativeWidgetAura* window = Init(parent.get(), widget.get()); window->CenterWindow(gfx::Size(100, 100)); - EXPECT_EQ(gfx::Rect((480 - 100) / 2, - (320 - 100) / 2, - 100, 100), + EXPECT_EQ(gfx::Rect((480 - 100) / 2, (320 - 100) / 2, 100, 100), window->GetNativeWindow()->bounds()); widget->CloseNow(); } @@ -158,9 +155,7 @@ class TestWindowObserver : public aura::WindowObserver { explicit TestWindowObserver(gfx::NativeWindow window) : window_(window) { window_->AddObserver(this); } - ~TestWindowObserver() override { - window_->RemoveObserver(this); - } + ~TestWindowObserver() override { window_->RemoveObserver(this); } // aura::WindowObserver: void OnWindowPropertyChanged(aura::Window* window, @@ -181,7 +176,7 @@ class TestWindowObserver : public aura::WindowObserver { int count_ = 0; ui::WindowShowState state_ = ui::WindowShowState::SHOW_STATE_DEFAULT; - DISALLOW_COPY_AND_ASSIGN(TestWindowObserver); + DISALLOW_COPY_AND_ASSIGN(TestWindowObserver); }; // Tests that window transitions from normal to minimized and back do not @@ -255,7 +250,7 @@ class MaximizeLayoutManager : public TestLayoutManagerBase { // This simulates BrowserView, which creates a custom RootView so that // OnNativeWidgetSizeChanged that is invoked during Init matters. -class TestWidget : public views::Widget { +class TestWidget : public Widget { public: TestWidget() = default; @@ -289,7 +284,7 @@ TEST_F(NativeWidgetAuraTest, ShowMaximizedDoesntBounceAround) { root_window()->SetLayoutManager(new MaximizeLayoutManager); std::unique_ptr<TestWidget> widget(new TestWidget()); Widget::InitParams params(Widget::InitParams::TYPE_WINDOW); - params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; + params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; params.parent = nullptr; params.context = root_window(); params.show_state = ui::SHOW_STATE_MAXIMIZED; @@ -321,13 +316,13 @@ class PropertyTestLayoutManager : public TestLayoutManagerBase { DISALLOW_COPY_AND_ASSIGN(PropertyTestLayoutManager); }; -class PropertyTestWidgetDelegate : public views::WidgetDelegate { +class PropertyTestWidgetDelegate : public WidgetDelegate { public: explicit PropertyTestWidgetDelegate(Widget* widget) : widget_(widget) {} ~PropertyTestWidgetDelegate() override = default; private: - // views::WidgetDelegate: + // WidgetDelegate: bool CanMaximize() const override { return true; } bool CanMinimize() const override { return true; } bool CanResize() const override { return true; } @@ -346,7 +341,7 @@ TEST_F(NativeWidgetAuraTest, TestPropertiesWhenAddedToLayout) { root_window()->SetLayoutManager(layout_manager); std::unique_ptr<TestWidget> widget(new TestWidget()); Widget::InitParams params(Widget::InitParams::TYPE_WINDOW); - params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; + params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; params.delegate = new PropertyTestWidgetDelegate(widget.get()); params.parent = nullptr; params.context = root_window(); @@ -358,7 +353,7 @@ TEST_F(NativeWidgetAuraTest, TestPropertiesWhenAddedToLayout) { TEST_F(NativeWidgetAuraTest, GetClientAreaScreenBounds) { // Create a widget. Widget::InitParams params(Widget::InitParams::TYPE_WINDOW); - params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; + params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; params.context = root_window(); params.bounds.SetRect(10, 20, 300, 400); std::unique_ptr<Widget> widget(new Widget()); @@ -373,20 +368,14 @@ TEST_F(NativeWidgetAuraTest, GetClientAreaScreenBounds) { } // View subclass that tracks whether it has gotten a gesture event. -class GestureTrackingView : public views::View { +class GestureTrackingView : public View { public: GestureTrackingView() = default; - void set_consume_gesture_event(bool value) { - consume_gesture_event_ = value; - } + void set_consume_gesture_event(bool value) { consume_gesture_event_ = value; } - void clear_got_gesture_event() { - got_gesture_event_ = false; - } - bool got_gesture_event() const { - return got_gesture_event_; - } + void clear_got_gesture_event() { got_gesture_event_ = false; } + bool got_gesture_event() const { return got_gesture_event_; } // View overrides: void OnGestureEvent(ui::GestureEvent* event) override { @@ -417,7 +406,7 @@ TEST_F(NativeWidgetAuraTest, DontCaptureOnGesture) { view->AddChildView(child); std::unique_ptr<TestWidget> widget(new TestWidget()); Widget::InitParams params(Widget::InitParams::TYPE_WINDOW_FRAMELESS); - params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; + params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; params.context = root_window(); params.bounds = gfx::Rect(0, 0, 100, 200); widget->Init(std::move(params)); @@ -447,20 +436,15 @@ TEST_F(NativeWidgetAuraTest, DontCaptureOnGesture) { EXPECT_TRUE(view->got_gesture_event()); EXPECT_FALSE(child->got_gesture_event()); view->clear_got_gesture_event(); - - // Work around for bug in NativeWidgetAura. - // TODO: fix bug and remove this. - widget->Close(); } // Verifies views with layers are targeted for events properly. TEST_F(NativeWidgetAuraTest, PreferViewLayersToChildWindows) { // Create two widgets: |parent| and |child|. |child| is a child of |parent|. - views::View* parent_root = new views::View; + View* parent_root = new View; std::unique_ptr<Widget> parent(new Widget()); Widget::InitParams parent_params(Widget::InitParams::TYPE_WINDOW_FRAMELESS); - parent_params.ownership = - views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; + parent_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; parent_params.context = root_window(); parent->Init(std::move(parent_params)); parent->SetContentsView(parent_root); @@ -469,51 +453,46 @@ TEST_F(NativeWidgetAuraTest, PreferViewLayersToChildWindows) { std::unique_ptr<Widget> child(new Widget()); Widget::InitParams child_params(Widget::InitParams::TYPE_CONTROL); - child_params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; + child_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; child_params.parent = parent->GetNativeWindow(); child->Init(std::move(child_params)); child->SetBounds(gfx::Rect(0, 0, 200, 200)); child->Show(); // Point is over |child|. - EXPECT_EQ(child->GetNativeWindow(), - parent->GetNativeWindow()->GetEventHandlerForPoint( - gfx::Point(50, 50))); + EXPECT_EQ( + child->GetNativeWindow(), + parent->GetNativeWindow()->GetEventHandlerForPoint(gfx::Point(50, 50))); // Create a view with a layer and stack it at the bottom (below |child|). - views::View* view_with_layer = new views::View; + View* view_with_layer = new View; parent_root->AddChildView(view_with_layer); view_with_layer->SetBounds(0, 0, 50, 50); view_with_layer->SetPaintToLayer(); // Make sure that |child| still gets the event. - EXPECT_EQ(child->GetNativeWindow(), - parent->GetNativeWindow()->GetEventHandlerForPoint( - gfx::Point(20, 20))); + EXPECT_EQ( + child->GetNativeWindow(), + parent->GetNativeWindow()->GetEventHandlerForPoint(gfx::Point(20, 20))); // Move |view_with_layer| to the top and make sure it gets the // event when the point is within |view_with_layer|'s bounds. - view_with_layer->layer()->parent()->StackAtTop( - view_with_layer->layer()); - EXPECT_EQ(parent->GetNativeWindow(), - parent->GetNativeWindow()->GetEventHandlerForPoint( - gfx::Point(20, 20))); + view_with_layer->layer()->parent()->StackAtTop(view_with_layer->layer()); + EXPECT_EQ( + parent->GetNativeWindow(), + parent->GetNativeWindow()->GetEventHandlerForPoint(gfx::Point(20, 20))); // Point is over |child|, it should get the event. - EXPECT_EQ(child->GetNativeWindow(), - parent->GetNativeWindow()->GetEventHandlerForPoint( - gfx::Point(70, 70))); + EXPECT_EQ( + child->GetNativeWindow(), + parent->GetNativeWindow()->GetEventHandlerForPoint(gfx::Point(70, 70))); delete view_with_layer; view_with_layer = nullptr; - EXPECT_EQ(child->GetNativeWindow(), - parent->GetNativeWindow()->GetEventHandlerForPoint( - gfx::Point(20, 20))); - - // Work around for bug in NativeWidgetAura. - // TODO: fix bug and remove this. - parent->Close(); + EXPECT_EQ( + child->GetNativeWindow(), + parent->GetNativeWindow()->GetEventHandlerForPoint(gfx::Point(20, 20))); } // Verifies views with layers are targeted for events properly. @@ -570,7 +549,7 @@ TEST_F(NativeWidgetAuraTest, FlashFrame) { std::unique_ptr<Widget> widget(new Widget()); Widget::InitParams params(Widget::InitParams::TYPE_WINDOW); params.context = root_window(); - params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; + params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; widget->Init(std::move(params)); aura::Window* window = widget->GetNativeWindow(); EXPECT_FALSE(window->GetProperty(aura::client::kDrawAttentionKey)); @@ -621,14 +600,12 @@ class MoveTestWidgetDelegate : public WidgetDelegateView { TEST_F(NativeWidgetAuraTest, OnWidgetMovedInvokedAfterAcquireLayer) { // |delegate| deletes itself when the widget is destroyed. MoveTestWidgetDelegate* delegate = new MoveTestWidgetDelegate; - Widget* widget = - Widget::CreateWindowWithContextAndBounds(delegate, - root_window(), - gfx::Rect(10, 10, 100, 200)); + Widget* widget = Widget::CreateWindowWithContext(delegate, root_window(), + gfx::Rect(10, 10, 100, 200)); widget->Show(); delegate->ClearGotMove(); // Simulate a maximize with animation. - delete widget->GetNativeView()->RecreateLayer().release(); + widget->GetNativeView()->RecreateLayer(); widget->SetBounds(gfx::Rect(0, 0, 500, 500)); EXPECT_TRUE(delegate->got_move()); widget->CloseNow(); @@ -639,12 +616,12 @@ TEST_F(NativeWidgetAuraTest, OnWidgetMovedInvokedAfterAcquireLayer) { // can not be activated. TEST_F(NativeWidgetAuraTest, PreventFocusOnNonActivableWindow) { test_focus_rules()->set_can_activate(false); - views::test::TestInitialFocusWidgetDelegate delegate(root_window()); + test::TestInitialFocusWidgetDelegate delegate(root_window()); delegate.GetWidget()->Show(); EXPECT_FALSE(delegate.view()->HasFocus()); test_focus_rules()->set_can_activate(true); - views::test::TestInitialFocusWidgetDelegate delegate2(root_window()); + test::TestInitialFocusWidgetDelegate delegate2(root_window()); delegate2.GetWidget()->Show(); EXPECT_TRUE(delegate2.view()->HasFocus()); } @@ -683,5 +660,65 @@ TEST_F(NativeWidgetAuraTest, VisibilityOfChildBubbleWindow) { EXPECT_TRUE(child.IsVisible()); } +class ModalWidgetDelegate : public WidgetDelegate { + public: + explicit ModalWidgetDelegate(Widget* widget) : widget_(widget) {} + ~ModalWidgetDelegate() override = default; + + // WidgetDelegate: + void DeleteDelegate() override { delete this; } + Widget* GetWidget() override { return widget_; } + const Widget* GetWidget() const override { return widget_; } + ui::ModalType GetModalType() const override { + return ui::ModalType::MODAL_TYPE_WINDOW; + } + + private: + Widget* widget_; + + DISALLOW_COPY_AND_ASSIGN(ModalWidgetDelegate); +}; + +// Tests that for a child transient window, if its modal type is +// ui::MODAL_TYPE_WINDOW, then its visibility is controlled by its transient +// parent's visibility. +TEST_F(NativeWidgetAuraTest, TransientChildModalWindowVisibility) { + // Create a parent window. + Widget parent; + Widget::InitParams parent_params(Widget::InitParams::TYPE_WINDOW); + parent_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; + parent_params.context = root_window(); + parent.Init(std::move(parent_params)); + parent.SetBounds(gfx::Rect(0, 0, 400, 400)); + parent.Show(); + EXPECT_TRUE(parent.IsVisible()); + + // Create a ui::MODAL_TYPE_WINDOW modal type transient child window. + Widget child; + Widget::InitParams child_params(Widget::InitParams::TYPE_WINDOW); + child_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; + child_params.parent = parent.GetNativeWindow(); + child_params.delegate = new ModalWidgetDelegate(&child); + child.Init(std::move(child_params)); + child.SetBounds(gfx::Rect(0, 0, 200, 200)); + child.Show(); + EXPECT_TRUE(parent.IsVisible()); + EXPECT_TRUE(child.IsVisible()); + + // Hide the parent window should also hide the child window. + parent.Hide(); + EXPECT_FALSE(parent.IsVisible()); + EXPECT_FALSE(child.IsVisible()); + + // The child window can't be shown if the parent window is hidden. + child.Show(); + EXPECT_FALSE(parent.IsVisible()); + EXPECT_FALSE(child.IsVisible()); + + parent.Show(); + EXPECT_TRUE(parent.IsVisible()); + EXPECT_TRUE(child.IsVisible()); +} + } // namespace } // namespace views |