Index: ui/views/widget/desktop_aura/desktop_native_widget_aura_unittest.cc |
diff --git a/ui/views/widget/desktop_aura/desktop_native_widget_aura_unittest.cc b/ui/views/widget/desktop_aura/desktop_native_widget_aura_unittest.cc |
index 975a2179a5496d0b1da0da700e5cea873659b741..60eef52bd76feacd570693d37bf5b79267a03506 100644 |
--- a/ui/views/widget/desktop_aura/desktop_native_widget_aura_unittest.cc |
+++ b/ui/views/widget/desktop_aura/desktop_native_widget_aura_unittest.cc |
@@ -12,6 +12,7 @@ |
#include "ui/aura/window.h" |
#include "ui/aura/window_tree_host.h" |
#include "ui/events/test/event_generator.h" |
+#include "ui/gfx/screen.h" |
#include "ui/views/test/views_test_base.h" |
#include "ui/views/test/widget_test.h" |
#include "ui/views/widget/widget.h" |
@@ -249,7 +250,8 @@ class DesktopAuraTopLevelWindowTest |
: top_level_widget_(NULL), |
owned_window_(NULL), |
owner_destroyed_(false), |
- owned_window_destroyed_(false) {} |
+ owned_window_destroyed_(false), |
+ use_async_mode_(true) {} |
~DesktopAuraTopLevelWindowTest() override { |
EXPECT_TRUE(owner_destroyed_); |
@@ -302,6 +304,13 @@ class DesktopAuraTopLevelWindowTest |
void DestroyOwnedWindow() { |
ASSERT_TRUE(owned_window_ != NULL); |
+ // If async mode is off then clean up state here. |
+ if (!use_async_mode_) { |
+ owned_window_->RemoveObserver(this); |
+ owned_window_->parent()->RemoveObserver(this); |
+ owner_destroyed_ = true; |
+ owned_window_destroyed_ = true; |
+ } |
delete owned_window_; |
} |
@@ -329,6 +338,10 @@ class DesktopAuraTopLevelWindowTest |
return top_level_widget_; |
} |
+ void set_use_async_mode(bool async_mode) { |
+ use_async_mode_ = async_mode; |
+ } |
+ |
private: |
views::Widget widget_; |
views::Widget* top_level_widget_; |
@@ -336,6 +349,9 @@ class DesktopAuraTopLevelWindowTest |
bool owner_destroyed_; |
bool owned_window_destroyed_; |
aura::test::TestWindowDelegate child_window_delegate_; |
+ // This flag controls whether we need to wait for the destruction to complete |
+ // before finishing the test. Defaults to true. |
+ bool use_async_mode_; |
DISALLOW_COPY_AND_ASSIGN(DesktopAuraTopLevelWindowTest); |
}; |
@@ -381,6 +397,9 @@ TEST_F(DesktopAuraWidgetTest, TopLevelOwnedPopupTest) { |
TEST_F(DesktopAuraWidgetTest, TopLevelOwnedPopupResizeTest) { |
ViewsDelegate::views_delegate = NULL; |
DesktopAuraTopLevelWindowTest popup_window; |
+ |
+ popup_window.set_use_async_mode(false); |
+ |
ASSERT_NO_FATAL_FAILURE(popup_window.CreateTopLevelWindow( |
gfx::Rect(0, 0, 200, 200), false)); |
@@ -389,9 +408,31 @@ TEST_F(DesktopAuraWidgetTest, TopLevelOwnedPopupResizeTest) { |
EXPECT_EQ(popup_window.top_level_widget()->GetNativeView()->bounds().size(), |
new_size.size()); |
- RunPendingMessages(); |
+ |
+ ASSERT_NO_FATAL_FAILURE(popup_window.DestroyOwnedWindow()); |
+} |
+ |
+// This test validates that when a top level owned popup Aura window is |
+// repositioned, the widget is repositioned as well. |
+TEST_F(DesktopAuraWidgetTest, TopLevelOwnedPopupRepositionTest) { |
+ ViewsDelegate::views_delegate = NULL; |
+ DesktopAuraTopLevelWindowTest popup_window; |
+ |
+ popup_window.set_use_async_mode(false); |
+ |
+ ASSERT_NO_FATAL_FAILURE(popup_window.CreateTopLevelWindow( |
+ gfx::Rect(0, 0, 200, 200), false)); |
+ |
+ gfx::Rect new_pos(10, 10, 400, 400); |
+ popup_window.owned_window()->SetBoundsInScreen( |
+ new_pos, |
+ gfx::Screen::GetScreenFor( |
+ popup_window.owned_window())->GetDisplayNearestPoint(gfx::Point())); |
+ |
+ EXPECT_EQ(new_pos, |
+ popup_window.top_level_widget()->GetWindowBoundsInScreen()); |
+ |
ASSERT_NO_FATAL_FAILURE(popup_window.DestroyOwnedWindow()); |
- RunPendingMessages(); |
} |
} // namespace test |