Index: ui/views/widget/desktop_aura/desktop_screen_x11_unittest.cc |
diff --git a/ui/views/widget/desktop_aura/desktop_screen_x11_unittest.cc b/ui/views/widget/desktop_aura/desktop_screen_x11_unittest.cc |
index d0c0a8631c7c6dc6fa50dd90671a5881725ce74a..4e0c3647b138f077f700a1a9ae8eab5e31d1fb69 100644 |
--- a/ui/views/widget/desktop_aura/desktop_screen_x11_unittest.cc |
+++ b/ui/views/widget/desktop_aura/desktop_screen_x11_unittest.cc |
@@ -8,9 +8,12 @@ |
#include "base/message_loop/message_loop.h" |
#include "base/run_loop.h" |
#include "testing/gtest/include/gtest/gtest.h" |
+#include "ui/aura/client/aura_constants.cc" |
+#include "ui/aura/test/event_generator.h" |
#include "ui/aura/window.h" |
#include "ui/aura/window_event_dispatcher.h" |
#include "ui/aura/window_tree_host.h" |
+#include "ui/base/hit_test.h" |
#include "ui/base/x/x11_util.h" |
#include "ui/events/platform/platform_event_dispatcher.h" |
#include "ui/events/platform/platform_event_source.h" |
@@ -21,6 +24,34 @@ |
#include "ui/views/widget/desktop_aura/desktop_native_widget_aura.h" |
#include "ui/views/widget/desktop_aura/desktop_window_tree_host_x11.h" |
+namespace { |
+ |
+// Class which allows for the designation of non-client component targets of |
+// hit tests. |
+class TestDesktopNativeWidgetAura : public views::DesktopNativeWidgetAura { |
+ public: |
+ explicit TestDesktopNativeWidgetAura( |
+ views::internal::NativeWidgetDelegate* delegate) |
+ : views::DesktopNativeWidgetAura(delegate) {} |
+ virtual ~TestDesktopNativeWidgetAura() {} |
+ |
+ void set_window_component(int window_component) { |
+ window_component_ = window_component; |
+ } |
+ |
+ // DesktopNativeWidgetAura: |
+ virtual int GetNonClientComponent(const gfx::Point& point) const OVERRIDE { |
+ return window_component_; |
+ } |
+ |
+ private: |
+ int window_component_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(TestDesktopNativeWidgetAura); |
+}; |
+ |
+} // namespace |
+ |
namespace views { |
const int64 kFirstDisplay = 5321829; |
@@ -125,12 +156,18 @@ class DesktopScreenX11Test : public views::ViewsTestBase, |
removed_display_.clear(); |
} |
- Widget* BuildTopLevelDesktopWidget(const gfx::Rect& bounds) { |
+ Widget* BuildTopLevelDesktopWidget(const gfx::Rect& bounds, |
+ bool use_test_native_widget) { |
Widget* toplevel = new Widget; |
Widget::InitParams toplevel_params = |
CreateParams(Widget::InitParams::TYPE_WINDOW); |
- toplevel_params.native_widget = |
- new views::DesktopNativeWidgetAura(toplevel); |
+ if (use_test_native_widget) { |
+ toplevel_params.native_widget = |
+ new TestDesktopNativeWidgetAura(toplevel); |
+ } else { |
+ toplevel_params.native_widget = |
+ new views::DesktopNativeWidgetAura(toplevel); |
+ } |
toplevel_params.bounds = bounds; |
toplevel_params.remove_standard_frame = true; |
toplevel->Init(toplevel_params); |
@@ -275,10 +312,12 @@ TEST_F(DesktopScreenX11Test, GetPrimaryDisplay) { |
} |
TEST_F(DesktopScreenX11Test, GetWindowAtScreenPoint) { |
- Widget* window_one = BuildTopLevelDesktopWidget(gfx::Rect(110, 110, 10, 10)); |
- Widget* window_two = BuildTopLevelDesktopWidget(gfx::Rect(150, 150, 10, 10)); |
+ Widget* window_one = BuildTopLevelDesktopWidget(gfx::Rect(110, 110, 10, 10), |
+ false); |
+ Widget* window_two = BuildTopLevelDesktopWidget(gfx::Rect(150, 150, 10, 10), |
+ false); |
Widget* window_three = |
- BuildTopLevelDesktopWidget(gfx::Rect(115, 115, 20, 20)); |
+ BuildTopLevelDesktopWidget(gfx::Rect(115, 115, 20, 20), false); |
window_three->Show(); |
window_two->Show(); |
@@ -317,8 +356,10 @@ TEST_F(DesktopScreenX11Test, GetDisplayNearestWindow) { |
gfx::Rect(640, 0, 1024, 768))); |
screen()->ProcessDisplayChange(displays); |
- Widget* window_one = BuildTopLevelDesktopWidget(gfx::Rect(10, 10, 10, 10)); |
- Widget* window_two = BuildTopLevelDesktopWidget(gfx::Rect(650, 50, 10, 10)); |
+ Widget* window_one = BuildTopLevelDesktopWidget(gfx::Rect(10, 10, 10, 10), |
+ false); |
+ Widget* window_two = BuildTopLevelDesktopWidget(gfx::Rect(650, 50, 10, 10), |
+ false); |
EXPECT_EQ( |
kFirstDisplay, |
@@ -331,4 +372,87 @@ TEST_F(DesktopScreenX11Test, GetDisplayNearestWindow) { |
window_two->CloseNow(); |
} |
+// Tests that the window is maximized in response to a double click event. |
+TEST_F(DesktopScreenX11Test, DoubleClickHeaderMaximizes) { |
+ Widget* widget = BuildTopLevelDesktopWidget(gfx::Rect(0, 0, 100, 100), true); |
+ widget->Show(); |
+ TestDesktopNativeWidgetAura* native_widget = |
+ static_cast<TestDesktopNativeWidgetAura*>(widget->native_widget()); |
+ native_widget->set_window_component(HTCAPTION); |
+ |
+ aura::Window* window = widget->GetNativeWindow(); |
+ window->SetProperty(aura::client::kCanMaximizeKey, true); |
+ |
+ // Cast to superclass as DesktopWindowTreeHostX11 hide IsMaximized |
+ DesktopWindowTreeHost* rwh = |
+ DesktopWindowTreeHostX11::GetHostForXID(window->GetHost()-> |
+ GetAcceleratedWidget()); |
+ |
+ aura::test::EventGenerator generator(window); |
+ generator.ClickLeftButton(); |
+ generator.DoubleClickLeftButton(); |
+ RunPendingMessages(); |
+ EXPECT_TRUE(rwh->IsMaximized()); |
+ |
+ widget->CloseNow(); |
+} |
+ |
+// Tests that the window does not maximize in response to a double click event, |
+// if the first click was to a different target component than that of the |
+// second click. |
+TEST_F(DesktopScreenX11Test, DoubleClickTwoDifferentTargetsDoesntMaximizes) { |
+ Widget* widget = BuildTopLevelDesktopWidget(gfx::Rect(0, 0, 100, 100), true); |
+ widget->Show(); |
+ TestDesktopNativeWidgetAura* native_widget = |
+ static_cast<TestDesktopNativeWidgetAura*>(widget->native_widget()); |
+ |
+ aura::Window* window = widget->GetNativeWindow(); |
+ window->SetProperty(aura::client::kCanMaximizeKey, true); |
+ |
+ // Cast to superclass as DesktopWindowTreeHostX11 hide IsMaximized |
+ DesktopWindowTreeHost* rwh = |
+ DesktopWindowTreeHostX11::GetHostForXID(window->GetHost()-> |
+ GetAcceleratedWidget()); |
+ |
+ aura::test::EventGenerator generator(window); |
+ native_widget->set_window_component(HTCLIENT); |
+ generator.ClickLeftButton(); |
+ native_widget->set_window_component(HTCAPTION); |
+ generator.DoubleClickLeftButton(); |
+ RunPendingMessages(); |
+ EXPECT_FALSE(rwh->IsMaximized()); |
+ |
+ widget->CloseNow(); |
+} |
+ |
+// Tests that the window does not maximize in response to a double click event, |
+// if the double click was interrupted by a right click. |
+TEST_F(DesktopScreenX11Test, RightClickDuringDoubleClickDoesntMaximize) { |
+ Widget* widget = BuildTopLevelDesktopWidget(gfx::Rect(0, 0, 100, 100), true); |
+ widget->Show(); |
+ TestDesktopNativeWidgetAura* native_widget = |
+ static_cast<TestDesktopNativeWidgetAura*>(widget->native_widget()); |
+ |
+ aura::Window* window = widget->GetNativeWindow(); |
+ window->SetProperty(aura::client::kCanMaximizeKey, true); |
+ |
+ // Cast to superclass as DesktopWindowTreeHostX11 hide IsMaximized |
+ DesktopWindowTreeHost* rwh = static_cast<DesktopWindowTreeHost*>( |
+ DesktopWindowTreeHostX11::GetHostForXID(window->GetHost()-> |
+ GetAcceleratedWidget())); |
+ |
+ aura::test::EventGenerator generator(window); |
+ native_widget->set_window_component(HTCLIENT); |
+ generator.ClickLeftButton(); |
+ native_widget->set_window_component(HTCAPTION); |
+ generator.PressRightButton(); |
+ generator.ReleaseRightButton(); |
+ EXPECT_FALSE(rwh->IsMaximized()); |
+ generator.DoubleClickLeftButton(); |
+ RunPendingMessages(); |
+ EXPECT_FALSE(rwh->IsMaximized()); |
+ |
+ widget->CloseNow(); |
+} |
+ |
} // namespace views |