Index: ui/views/widget/widget_unittest.cc |
diff --git a/ui/views/widget/widget_unittest.cc b/ui/views/widget/widget_unittest.cc |
index 4bf28df3aa24ee652d4b245825169ad85b8ba9b9..075b2d6d09607d96d4f61755244504672ce37cb4 100644 |
--- a/ui/views/widget/widget_unittest.cc |
+++ b/ui/views/widget/widget_unittest.cc |
@@ -12,12 +12,6 @@ |
#include "base/run_loop.h" |
#include "base/strings/utf_string_conversions.h" |
#include "testing/gtest/include/gtest/gtest.h" |
-#include "ui/aura/client/aura_constants.h" |
-#include "ui/aura/client/window_tree_client.h" |
-#include "ui/aura/root_window.h" |
-#include "ui/aura/test/event_generator.h" |
-#include "ui/aura/test/test_window_delegate.h" |
-#include "ui/aura/window.h" |
#include "ui/base/hit_test.h" |
#include "ui/events/event_utils.h" |
#include "ui/gfx/native_widget_types.h" |
@@ -27,15 +21,23 @@ |
#include "ui/views/test/test_views_delegate.h" |
#include "ui/views/test/widget_test.h" |
#include "ui/views/views_delegate.h" |
-#include "ui/views/widget/native_widget_aura.h" |
#include "ui/views/widget/native_widget_delegate.h" |
#include "ui/views/widget/root_view.h" |
-#include "ui/views/widget/widget_deletion_observer.h" |
#include "ui/views/window/dialog_delegate.h" |
#include "ui/views/window/native_frame_view.h" |
+#if defined(USE_AURA) |
+#include "ui/aura/client/aura_constants.h" |
+#include "ui/aura/client/window_tree_client.h" |
+#include "ui/aura/root_window.h" |
+#include "ui/aura/test/test_window_delegate.h" |
+#include "ui/aura/window.h" |
+#include "ui/views/widget/native_widget_aura.h" |
#if !defined(OS_CHROMEOS) |
#include "ui/views/widget/desktop_aura/desktop_native_widget_aura.h" |
+#endif |
+#elif defined(OS_WIN) |
+#include "ui/views/widget/native_widget_win.h" |
#endif |
#if defined(OS_WIN) |
@@ -158,33 +160,6 @@ |
std::map<ui::EventType, int> event_count_; |
DISALLOW_COPY_AND_ASSIGN(EventCountHandler); |
-}; |
- |
-// Class that closes the widget (which ends up deleting it immediately) when the |
-// appropriate event is received. |
-class CloseWidgetView : public View { |
- public: |
- explicit CloseWidgetView(ui::EventType event_type) |
- : event_type_(event_type) { |
- } |
- |
- // ui::EventHandler override: |
- virtual void OnEvent(ui::Event* event) OVERRIDE { |
- if (event->type() == event_type_) { |
- // Go through NativeWidgetPrivate to simulate what happens if the OS |
- // deletes the NativeWindow out from under us. |
- GetWidget()->native_widget_private()->CloseNow(); |
- } else { |
- View::OnEvent(event); |
- if (!event->IsTouchEvent()) |
- event->SetHandled(); |
- } |
- } |
- |
- private: |
- const ui::EventType event_type_; |
- |
- DISALLOW_COPY_AND_ASSIGN(CloseWidgetView); |
}; |
ui::WindowShowState GetWidgetShowState(const Widget* widget) { |
@@ -630,6 +605,12 @@ |
widget->ReleaseCapture(); |
widget->HasCapture(); |
widget->GetWorkAreaBoundsInScreen(); |
+ // These three crash with NativeWidgetWin, so I'm assuming we don't need |
+ // them to work for the other NativeWidget impls. |
+ // widget->CenterWindow(gfx::Size(50, 60)); |
+ // widget->GetRestoredBounds(); |
+ // widget->ShowInactive(); |
+ // widget->Show(); |
} |
private: |
@@ -1288,6 +1269,54 @@ |
// nested message loops from such events, nor has the code ever really dealt |
// with this situation. |
+// Class that closes the widget (which ends up deleting it immediately) when the |
+// appropriate event is received. |
+class CloseWidgetView : public View { |
+ public: |
+ explicit CloseWidgetView(ui::EventType event_type) |
+ : event_type_(event_type) { |
+ } |
+ |
+ // View overrides: |
+ virtual bool OnMousePressed(const ui::MouseEvent& event) OVERRIDE { |
+ if (!CloseWidget(event)) |
+ View::OnMousePressed(event); |
+ return true; |
+ } |
+ virtual bool OnMouseDragged(const ui::MouseEvent& event) OVERRIDE { |
+ if (!CloseWidget(event)) |
+ View::OnMouseDragged(event); |
+ return true; |
+ } |
+ virtual void OnMouseReleased(const ui::MouseEvent& event) OVERRIDE { |
+ if (!CloseWidget(event)) |
+ View::OnMouseReleased(event); |
+ } |
+ virtual void OnMouseMoved(const ui::MouseEvent& event) OVERRIDE { |
+ if (!CloseWidget(event)) |
+ View::OnMouseMoved(event); |
+ } |
+ virtual void OnMouseEntered(const ui::MouseEvent& event) OVERRIDE { |
+ if (!CloseWidget(event)) |
+ View::OnMouseEntered(event); |
+ } |
+ |
+ private: |
+ bool CloseWidget(const ui::LocatedEvent& event) { |
+ if (event.type() == event_type_) { |
+ // Go through NativeWidgetPrivate to simulate what happens if the OS |
+ // deletes the NativeWindow out from under us. |
+ GetWidget()->native_widget_private()->CloseNow(); |
+ return true; |
+ } |
+ return false; |
+ } |
+ |
+ const ui::EventType event_type_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(CloseWidgetView); |
+}; |
+ |
// Generates two moves (first generates enter, second real move), a press, drag |
// and release stopping at |last_event_type|. |
void GenerateMouseEvents(Widget* widget, ui::EventType last_event_type) { |
@@ -1686,42 +1715,37 @@ |
EXPECT_TRUE(delegate->is_top_level()); |
} |
-TEST_F(WidgetTest, WidgetDeleted_InOnMousePressed) { |
+// A scumbag View that deletes its owning widget OnMousePressed. |
+class WidgetDeleterView : public View { |
+ public: |
+ WidgetDeleterView() : View() {} |
+ |
+ // Overridden from View. |
+ virtual bool OnMousePressed(const ui::MouseEvent& event) OVERRIDE { |
+ delete GetWidget(); |
+ return true; |
+ } |
+ |
+ private: |
+ DISALLOW_COPY_AND_ASSIGN(WidgetDeleterView); |
+}; |
+ |
+TEST_F(WidgetTest, TestWidgetDeletedInOnMousePressed) { |
Widget* widget = new Widget; |
Widget::InitParams params = |
CreateParams(views::Widget::InitParams::TYPE_POPUP); |
+ params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; |
widget->Init(params); |
- widget->SetContentsView(new CloseWidgetView(ui::ET_MOUSE_PRESSED)); |
+ widget->SetContentsView(new WidgetDeleterView); |
widget->SetSize(gfx::Size(100, 100)); |
widget->Show(); |
- aura::test::EventGenerator generator(GetContext(), widget->GetNativeWindow()); |
- |
- WidgetDeletionObserver deletion_observer(widget); |
- generator.ClickLeftButton(); |
- EXPECT_FALSE(deletion_observer.IsWidgetAlive()); |
- |
- // Yay we did not crash! |
-} |
- |
-TEST_F(WidgetTest, WidgetDeleted_InDispatchGestureEvent) { |
- Widget* widget = new Widget; |
- Widget::InitParams params = |
- CreateParams(views::Widget::InitParams::TYPE_POPUP); |
- widget->Init(params); |
- |
- widget->SetContentsView(new CloseWidgetView(ui::ET_GESTURE_TAP_DOWN)); |
- |
- widget->SetSize(gfx::Size(100, 100)); |
- widget->Show(); |
- |
- aura::test::EventGenerator generator(GetContext()); |
- |
- WidgetDeletionObserver deletion_observer(widget); |
- generator.GestureTapAt(widget->GetWindowBoundsInScreen().CenterPoint()); |
- EXPECT_FALSE(deletion_observer.IsWidgetAlive()); |
+ gfx::Point click_location(45, 15); |
+ ui::MouseEvent press(ui::ET_MOUSE_PRESSED, click_location, click_location, |
+ ui::EF_LEFT_MOUSE_BUTTON, ui::EF_LEFT_MOUSE_BUTTON); |
+ widget->OnMouseEvent(&press); |
// Yay we did not crash! |
} |