| Index: ui/views/widget/widget_unittest.cc
|
| diff --git a/ui/views/widget/widget_unittest.cc b/ui/views/widget/widget_unittest.cc
|
| index 075b2d6d09607d96d4f61755244504672ce37cb4..4bf28df3aa24ee652d4b245825169ad85b8ba9b9 100644
|
| --- a/ui/views/widget/widget_unittest.cc
|
| +++ b/ui/views/widget/widget_unittest.cc
|
| @@ -12,6 +12,12 @@
|
| #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"
|
| @@ -21,24 +27,16 @@
|
| #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)
|
| #include "ui/views/win/hwnd_util.h"
|
| @@ -162,6 +160,33 @@ class EventCountHandler : public ui::EventHandler {
|
| 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) {
|
| // Use IsMaximized/IsMinimized/IsFullScreen instead of GetWindowPlacement
|
| // because the former is implemented on all platforms but the latter is not.
|
| @@ -605,12 +630,6 @@ class WidgetWithDestroyedNativeViewTest : public ViewsTestBase {
|
| 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:
|
| @@ -1269,54 +1288,6 @@ TEST_F(WidgetTest, TestWindowVisibilityAfterHide) {
|
| // 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) {
|
| @@ -1715,37 +1686,42 @@ TEST_F(WidgetTest, SetTopLevelCorrectly) {
|
| EXPECT_TRUE(delegate->is_top_level());
|
| }
|
|
|
| -// A scumbag View that deletes its owning widget OnMousePressed.
|
| -class WidgetDeleterView : public View {
|
| - public:
|
| - WidgetDeleterView() : View() {}
|
| +TEST_F(WidgetTest, WidgetDeleted_InOnMousePressed) {
|
| + Widget* widget = new Widget;
|
| + Widget::InitParams params =
|
| + CreateParams(views::Widget::InitParams::TYPE_POPUP);
|
| + widget->Init(params);
|
|
|
| - // Overridden from View.
|
| - virtual bool OnMousePressed(const ui::MouseEvent& event) OVERRIDE {
|
| - delete GetWidget();
|
| - return true;
|
| - }
|
| + widget->SetContentsView(new CloseWidgetView(ui::ET_MOUSE_PRESSED));
|
|
|
| - private:
|
| - DISALLOW_COPY_AND_ASSIGN(WidgetDeleterView);
|
| -};
|
| + widget->SetSize(gfx::Size(100, 100));
|
| + widget->Show();
|
|
|
| -TEST_F(WidgetTest, TestWidgetDeletedInOnMousePressed) {
|
| + 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);
|
| - params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
|
| widget->Init(params);
|
|
|
| - widget->SetContentsView(new WidgetDeleterView);
|
| + widget->SetContentsView(new CloseWidgetView(ui::ET_GESTURE_TAP_DOWN));
|
|
|
| widget->SetSize(gfx::Size(100, 100));
|
| widget->Show();
|
|
|
| - 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);
|
| + aura::test::EventGenerator generator(GetContext());
|
| +
|
| + WidgetDeletionObserver deletion_observer(widget);
|
| + generator.GestureTapAt(widget->GetWindowBoundsInScreen().CenterPoint());
|
| + EXPECT_FALSE(deletion_observer.IsWidgetAlive());
|
|
|
| // Yay we did not crash!
|
| }
|
|
|