Commit 8d960d87 authored by tapted@chromium.org's avatar tapted@chromium.org

MacViews: Get widget_interactive_uitest compiling on Mac

This is done by refactoring some tests to observe focus changes in a
cross-platform manner, and by converting some custom-crafted events to
use the cross-platform event generator.

For now, the code that is only enabled on Windows is unchanged. This
still has aura dependencies, but I hope to enable some of these tests on
Mac in future.

BUG=399191

Review URL: https://codereview.chromium.org/444583002

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@287944 0039d316-1c4b-4281-b951-d872f2087c98
parent e80904a7
...@@ -19,8 +19,8 @@ ...@@ -19,8 +19,8 @@
#include "ui/views/accessible_pane_view.h" #include "ui/views/accessible_pane_view.h"
#include "ui/views/controls/button/label_button.h" #include "ui/views/controls/button/label_button.h"
#include "ui/views/focus/focus_manager_factory.h" #include "ui/views/focus/focus_manager_factory.h"
#include "ui/views/focus/focus_manager_test.h"
#include "ui/views/focus/widget_focus_manager.h" #include "ui/views/focus/widget_focus_manager.h"
#include "ui/views/test/focus_manager_test.h"
#include "ui/views/widget/widget.h" #include "ui/views/widget/widget.h"
namespace views { namespace views {
......
...@@ -20,7 +20,7 @@ ...@@ -20,7 +20,7 @@
#include "ui/views/controls/scroll_view.h" #include "ui/views/controls/scroll_view.h"
#include "ui/views/controls/tabbed_pane/tabbed_pane.h" #include "ui/views/controls/tabbed_pane/tabbed_pane.h"
#include "ui/views/controls/textfield/textfield.h" #include "ui/views/controls/textfield/textfield.h"
#include "ui/views/focus/focus_manager_test.h" #include "ui/views/test/focus_manager_test.h"
#include "ui/views/widget/root_view.h" #include "ui/views/widget/root_view.h"
#include "ui/views/widget/widget.h" #include "ui/views/widget/widget.h"
......
// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
#include "ui/views/focus/focus_manager_test.h" #include "ui/views/test/focus_manager_test.h"
#include <algorithm> #include <algorithm>
......
// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
#ifndef UI_VIEWS_FOCUS_FOCUS_MANAGER_TEST_H_ #ifndef UI_VIEWS_TEST_FOCUS_MANAGER_TEST_H_
#define UI_VIEWS_FOCUS_FOCUS_MANAGER_TEST_H_ #define UI_VIEWS_TEST_FOCUS_MANAGER_TEST_H_
#include "ui/views/focus/focus_manager.h" #include "ui/views/focus/focus_manager.h"
#include "ui/views/focus/widget_focus_manager.h" #include "ui/views/focus/widget_focus_manager.h"
...@@ -103,4 +103,4 @@ class TestWidgetFocusChangeListener : public WidgetFocusChangeListener { ...@@ -103,4 +103,4 @@ class TestWidgetFocusChangeListener : public WidgetFocusChangeListener {
} // namespace views } // namespace views
#endif // UI_VIEWS_FOCUS_FOCUS_MANAGER_TEST_H_ #endif // UI_VIEWS_TEST_FOCUS_MANAGER_TEST_H_
...@@ -449,6 +449,8 @@ ...@@ -449,6 +449,8 @@
'test/desktop_test_views_delegate_aura.cc', 'test/desktop_test_views_delegate_aura.cc',
'test/desktop_test_views_delegate_mac.mm', 'test/desktop_test_views_delegate_mac.mm',
'test/event_generator_delegate_mac.mm', 'test/event_generator_delegate_mac.mm',
'test/focus_manager_test.h',
'test/focus_manager_test.cc',
'test/menu_runner_test_api.cc', 'test/menu_runner_test_api.cc',
'test/menu_runner_test_api.h', 'test/menu_runner_test_api.h',
'test/slider_test_api.cc', 'test/slider_test_api.cc',
...@@ -518,8 +520,6 @@ ...@@ -518,8 +520,6 @@
'controls/textfield/textfield_unittest.cc', 'controls/textfield/textfield_unittest.cc',
'controls/textfield/textfield_model_unittest.cc', 'controls/textfield/textfield_model_unittest.cc',
'controls/tree/tree_view_unittest.cc', 'controls/tree/tree_view_unittest.cc',
'focus/focus_manager_test.h',
'focus/focus_manager_test.cc',
'focus/focus_manager_unittest.cc', 'focus/focus_manager_unittest.cc',
'focus/focus_traversal_unittest.cc', 'focus/focus_traversal_unittest.cc',
'ime/input_method_bridge_unittest.cc', 'ime/input_method_bridge_unittest.cc',
......
...@@ -9,10 +9,6 @@ ...@@ -9,10 +9,6 @@
#include "base/run_loop.h" #include "base/run_loop.h"
#include "base/strings/stringprintf.h" #include "base/strings/stringprintf.h"
#include "base/strings/utf_string_conversions.h" #include "base/strings/utf_string_conversions.h"
#include "ui/aura/client/focus_client.h"
#include "ui/aura/env.h"
#include "ui/aura/window.h"
#include "ui/aura/window_tree_host.h"
#include "ui/base/resource/resource_bundle.h" #include "ui/base/resource/resource_bundle.h"
#include "ui/base/ui_base_paths.h" #include "ui/base/ui_base_paths.h"
#include "ui/base/ui_base_switches.h" #include "ui/base/ui_base_switches.h"
...@@ -22,17 +18,18 @@ ...@@ -22,17 +18,18 @@
#include "ui/gl/gl_surface.h" #include "ui/gl/gl_surface.h"
#include "ui/views/controls/textfield/textfield.h" #include "ui/views/controls/textfield/textfield.h"
#include "ui/views/controls/textfield/textfield_test_api.h" #include "ui/views/controls/textfield/textfield_test_api.h"
#include "ui/views/focus/focus_manager.h"
#include "ui/views/test/focus_manager_test.h"
#include "ui/views/test/widget_test.h" #include "ui/views/test/widget_test.h"
#include "ui/views/touchui/touch_selection_controller_impl.h" #include "ui/views/touchui/touch_selection_controller_impl.h"
#include "ui/views/widget/widget.h" #include "ui/views/widget/widget.h"
#include "ui/views/window/dialog_delegate.h" #include "ui/views/window/dialog_delegate.h"
#include "ui/wm/public/activation_client.h" #include "ui/wm/public/activation_client.h"
#if !defined(OS_CHROMEOS)
#include "ui/views/widget/desktop_aura/desktop_native_widget_aura.h"
#endif
#if defined(OS_WIN) #if defined(OS_WIN)
#include "ui/aura/window.h"
#include "ui/aura/window_tree_host.h"
#include "ui/views/widget/desktop_aura/desktop_native_widget_aura.h"
#include "ui/views/win/hwnd_util.h" #include "ui/views/win/hwnd_util.h"
#endif #endif
...@@ -175,7 +172,10 @@ class WidgetTestInteractive : public WidgetTest { ...@@ -175,7 +172,10 @@ class WidgetTestInteractive : public WidgetTest {
DCHECK(controller); DCHECK(controller);
if (controller->context_menu_timer_.IsRunning()) { if (controller->context_menu_timer_.IsRunning()) {
controller->context_menu_timer_.Stop(); controller->context_menu_timer_.Stop();
// TODO(tapted): Enable this when porting ui/views/touchui to Mac.
#if !defined(OS_MACOSX)
controller->ContextMenuTimerFired(); controller->ContextMenuTimerFired();
#endif
} }
} }
...@@ -249,7 +249,7 @@ TEST_F(WidgetTestInteractive, DesktopNativeWidgetAuraActivationAndFocusTest) { ...@@ -249,7 +249,7 @@ TEST_F(WidgetTestInteractive, DesktopNativeWidgetAuraActivationAndFocusTest) {
reinterpret_cast<aura::Window*>(NULL)); reinterpret_cast<aura::Window*>(NULL));
EXPECT_EQ(activation_client1->GetActiveWindow(), widget1.GetNativeView()); EXPECT_EQ(activation_client1->GetActiveWindow(), widget1.GetNativeView());
} }
#endif #endif // defined(OS_WIN)
TEST_F(WidgetTestInteractive, CaptureAutoReset) { TEST_F(WidgetTestInteractive, CaptureAutoReset) {
Widget* toplevel = CreateTopLevelFramelessPlatformWidget(); Widget* toplevel = CreateTopLevelFramelessPlatformWidget();
...@@ -632,7 +632,7 @@ TEST_F(WidgetTestInteractive, WidgetNotActivatedOnFakeActivationMessages) { ...@@ -632,7 +632,7 @@ TEST_F(WidgetTestInteractive, WidgetNotActivatedOnFakeActivationMessages) {
EXPECT_EQ(true, widget1.active()); EXPECT_EQ(true, widget1.active());
EXPECT_EQ(false, widget2.active()); EXPECT_EQ(false, widget2.active());
} }
#endif #endif // defined(OS_WIN)
#if !defined(OS_CHROMEOS) #if !defined(OS_CHROMEOS)
// Provides functionality to create a window modal dialog. // Provides functionality to create a window modal dialog.
...@@ -655,6 +655,11 @@ class ModalDialogDelegate : public DialogDelegateView { ...@@ -655,6 +655,11 @@ class ModalDialogDelegate : public DialogDelegateView {
// Tests whether the focused window is set correctly when a modal window is // Tests whether the focused window is set correctly when a modal window is
// created and destroyed. When it is destroyed it should focus the owner window. // created and destroyed. When it is destroyed it should focus the owner window.
TEST_F(WidgetTestInteractive, WindowModalWindowDestroyedActivationTest) { TEST_F(WidgetTestInteractive, WindowModalWindowDestroyedActivationTest) {
TestWidgetFocusChangeListener focus_listener;
WidgetFocusManager::GetInstance()->AddFocusChangeListener(&focus_listener);
const std::vector<NativeViewPair>& focus_changes =
focus_listener.focus_changes();
// Create a top level widget. // Create a top level widget.
Widget top_level_widget; Widget top_level_widget;
Widget::InitParams init_params = Widget::InitParams init_params =
...@@ -663,13 +668,14 @@ TEST_F(WidgetTestInteractive, WindowModalWindowDestroyedActivationTest) { ...@@ -663,13 +668,14 @@ TEST_F(WidgetTestInteractive, WindowModalWindowDestroyedActivationTest) {
gfx::Rect initial_bounds(0, 0, 500, 500); gfx::Rect initial_bounds(0, 0, 500, 500);
init_params.bounds = initial_bounds; init_params.bounds = initial_bounds;
init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
init_params.native_widget = new DesktopNativeWidgetAura(&top_level_widget); init_params.native_widget =
new PlatformDesktopNativeWidget(&top_level_widget);
top_level_widget.Init(init_params); top_level_widget.Init(init_params);
top_level_widget.Show(); top_level_widget.Show();
aura::Window* top_level_window = top_level_widget.GetNativeWindow(); gfx::NativeView top_level_native_view = top_level_widget.GetNativeView();
EXPECT_EQ(top_level_window, aura::client::GetFocusClient( EXPECT_EQ(1u, focus_changes.size());
top_level_window)->GetFocusedWindow()); EXPECT_EQ(NativeViewPair(NULL, top_level_native_view), focus_changes[0]);
// Create a modal dialog. // Create a modal dialog.
// This instance will be destroyed when the dialog is destroyed. // This instance will be destroyed when the dialog is destroyed.
...@@ -677,21 +683,34 @@ TEST_F(WidgetTestInteractive, WindowModalWindowDestroyedActivationTest) { ...@@ -677,21 +683,34 @@ TEST_F(WidgetTestInteractive, WindowModalWindowDestroyedActivationTest) {
new ModalDialogDelegate(ui::MODAL_TYPE_WINDOW); new ModalDialogDelegate(ui::MODAL_TYPE_WINDOW);
Widget* modal_dialog_widget = views::DialogDelegate::CreateDialogWidget( Widget* modal_dialog_widget = views::DialogDelegate::CreateDialogWidget(
dialog_delegate, NULL, top_level_widget.GetNativeWindow()); dialog_delegate, NULL, top_level_widget.GetNativeView());
modal_dialog_widget->SetBounds(gfx::Rect(100, 100, 200, 200)); modal_dialog_widget->SetBounds(gfx::Rect(100, 100, 200, 200));
modal_dialog_widget->Show(); modal_dialog_widget->Show();
aura::Window* dialog_window = modal_dialog_widget->GetNativeWindow();
EXPECT_EQ(dialog_window, aura::client::GetFocusClient( gfx::NativeView modal_native_view = modal_dialog_widget->GetNativeView();
top_level_window)->GetFocusedWindow()); EXPECT_EQ(3u, focus_changes.size());
EXPECT_EQ(NativeViewPair(top_level_native_view, modal_native_view),
focus_changes[1]);
EXPECT_EQ(NativeViewPair(top_level_native_view, modal_native_view),
focus_changes[2]);
modal_dialog_widget->CloseNow(); modal_dialog_widget->CloseNow();
EXPECT_EQ(top_level_window, aura::client::GetFocusClient(
top_level_window)->GetFocusedWindow()); EXPECT_EQ(5u, focus_changes.size());
EXPECT_EQ(NativeViewPair(modal_native_view, top_level_native_view),
focus_changes[3]);
EXPECT_EQ(NativeViewPair(modal_native_view, top_level_native_view),
focus_changes[4]);
top_level_widget.CloseNow(); top_level_widget.CloseNow();
WidgetFocusManager::GetInstance()->RemoveFocusChangeListener(&focus_listener);
} }
// Test that when opening a system-modal window, capture is released. // Test that when opening a system-modal window, capture is released.
TEST_F(WidgetTestInteractive, SystemModalWindowReleasesCapture) { TEST_F(WidgetTestInteractive, SystemModalWindowReleasesCapture) {
TestWidgetFocusChangeListener focus_listener;
WidgetFocusManager::GetInstance()->AddFocusChangeListener(&focus_listener);
// Create a top level widget. // Create a top level widget.
Widget top_level_widget; Widget top_level_widget;
Widget::InitParams init_params = Widget::InitParams init_params =
...@@ -700,34 +719,35 @@ TEST_F(WidgetTestInteractive, SystemModalWindowReleasesCapture) { ...@@ -700,34 +719,35 @@ TEST_F(WidgetTestInteractive, SystemModalWindowReleasesCapture) {
gfx::Rect initial_bounds(0, 0, 500, 500); gfx::Rect initial_bounds(0, 0, 500, 500);
init_params.bounds = initial_bounds; init_params.bounds = initial_bounds;
init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
init_params.native_widget = new DesktopNativeWidgetAura(&top_level_widget); init_params.native_widget =
new PlatformDesktopNativeWidget(&top_level_widget);
top_level_widget.Init(init_params); top_level_widget.Init(init_params);
top_level_widget.Show(); top_level_widget.Show();
aura::Window* top_level_window = top_level_widget.GetNativeWindow(); EXPECT_EQ(top_level_widget.GetNativeView(),
EXPECT_EQ(top_level_window, aura::client::GetFocusClient( focus_listener.focus_changes().back().second);;
top_level_window)->GetFocusedWindow());
EXPECT_FALSE(top_level_window->HasCapture()); EXPECT_FALSE(top_level_widget.HasCapture());
top_level_window->SetCapture(); top_level_widget.SetCapture(NULL);
EXPECT_TRUE(top_level_window->HasCapture()); EXPECT_TRUE(top_level_widget.HasCapture());
// Create a modal dialog. // Create a modal dialog.
ModalDialogDelegate* dialog_delegate = ModalDialogDelegate* dialog_delegate =
new ModalDialogDelegate(ui::MODAL_TYPE_SYSTEM); new ModalDialogDelegate(ui::MODAL_TYPE_SYSTEM);
Widget* modal_dialog_widget = views::DialogDelegate::CreateDialogWidget( Widget* modal_dialog_widget = views::DialogDelegate::CreateDialogWidget(
dialog_delegate, NULL, top_level_widget.GetNativeWindow()); dialog_delegate, NULL, top_level_widget.GetNativeView());
modal_dialog_widget->SetBounds(gfx::Rect(100, 100, 200, 200)); modal_dialog_widget->SetBounds(gfx::Rect(100, 100, 200, 200));
modal_dialog_widget->Show(); modal_dialog_widget->Show();
EXPECT_FALSE(top_level_window->HasCapture()); EXPECT_FALSE(top_level_widget.HasCapture());
modal_dialog_widget->CloseNow(); modal_dialog_widget->CloseNow();
top_level_widget.CloseNow(); top_level_widget.CloseNow();
WidgetFocusManager::GetInstance()->RemoveFocusChangeListener(&focus_listener);
} }
#endif #endif // !defined(OS_CHROMEOS)
TEST_F(WidgetTestInteractive, CanActivateFlagIsHonored) { TEST_F(WidgetTestInteractive, CanActivateFlagIsHonored) {
Widget widget; Widget widget;
...@@ -737,7 +757,7 @@ TEST_F(WidgetTestInteractive, CanActivateFlagIsHonored) { ...@@ -737,7 +757,7 @@ TEST_F(WidgetTestInteractive, CanActivateFlagIsHonored) {
init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
init_params.activatable = Widget::InitParams::ACTIVATABLE_NO; init_params.activatable = Widget::InitParams::ACTIVATABLE_NO;
#if !defined(OS_CHROMEOS) #if !defined(OS_CHROMEOS)
init_params.native_widget = new DesktopNativeWidgetAura(&widget); init_params.native_widget = new PlatformDesktopNativeWidget(&widget);
#endif // !defined(OS_CHROMEOS) #endif // !defined(OS_CHROMEOS)
widget.Init(init_params); widget.Init(init_params);
...@@ -771,7 +791,7 @@ TEST_F(WidgetTestInteractive, TouchSelectionQuickMenuIsNotActivated) { ...@@ -771,7 +791,7 @@ TEST_F(WidgetTestInteractive, TouchSelectionQuickMenuIsNotActivated) {
RunPendingMessages(); RunPendingMessages();
ui::test::EventGenerator generator(widget.GetNativeView()->GetRootWindow()); ui::test::EventGenerator generator(widget.GetNativeWindow());
generator.GestureTapAt(gfx::Point(10, 10)); generator.GestureTapAt(gfx::Point(10, 10));
ShowQuickMenuImmediately(static_cast<TouchSelectionControllerImpl*>( ShowQuickMenuImmediately(static_cast<TouchSelectionControllerImpl*>(
textfield_test_api.touch_selection_controller())); textfield_test_api.touch_selection_controller()));
...@@ -874,7 +894,7 @@ class WidgetCaptureTest : public ViewsTestBase { ...@@ -874,7 +894,7 @@ class WidgetCaptureTest : public ViewsTestBase {
Widget* widget) { Widget* widget) {
#if !defined(OS_CHROMEOS) #if !defined(OS_CHROMEOS)
if (create_desktop_native_widget) if (create_desktop_native_widget)
return new DesktopNativeWidgetAura(widget); return new PlatformDesktopNativeWidget(widget);
#endif #endif
return NULL; return NULL;
} }
...@@ -919,11 +939,10 @@ TEST_F(WidgetCaptureTest, FailedCaptureRequestIsNoop) { ...@@ -919,11 +939,10 @@ TEST_F(WidgetCaptureTest, FailedCaptureRequestIsNoop) {
EXPECT_FALSE(widget.HasCapture()); EXPECT_FALSE(widget.HasCapture());
widget.Show(); widget.Show();
ui::MouseEvent mouse_press_event(ui::ET_MOUSE_PRESSED, gfx::Point(300, 10), ui::test::EventGenerator generator(GetContext(), widget.GetNativeWindow());
gfx::Point(300, 10), ui::EF_NONE, ui::EF_NONE); generator.set_current_location(gfx::Point(300, 10));
ui::EventDispatchDetails details = widget.GetNativeWindow()->GetHost()-> generator.PressLeftButton();
event_processor()->OnEventFromSource(&mouse_press_event);
ASSERT_FALSE(details.dispatcher_destroyed);
EXPECT_FALSE(mouse_view1->pressed()); EXPECT_FALSE(mouse_view1->pressed());
EXPECT_TRUE(mouse_view2->pressed()); EXPECT_TRUE(mouse_view2->pressed());
} }
...@@ -953,11 +972,10 @@ TEST_F(WidgetCaptureTest, MouseExitOnCaptureGrab) { ...@@ -953,11 +972,10 @@ TEST_F(WidgetCaptureTest, MouseExitOnCaptureGrab) {
widget2.Show(); widget2.Show();
widget2.SetBounds(gfx::Rect(400, 0, 300, 300)); widget2.SetBounds(gfx::Rect(400, 0, 300, 300));
ui::MouseEvent mouse_move_event(ui::ET_MOUSE_MOVED, gfx::Point(100, 100), ui::test::EventGenerator generator(widget1.GetNativeWindow());
gfx::Point(100, 100), ui::EF_NONE, ui::EF_NONE); generator.set_current_location(gfx::Point(100, 100));
ui::EventDispatchDetails details = widget1.GetNativeWindow()->GetHost()-> generator.MoveMouseBy(0, 0);
event_processor()->OnEventFromSource(&mouse_move_event);
ASSERT_FALSE(details.dispatcher_destroyed);
EXPECT_EQ(1, mouse_view1->EnteredCalls()); EXPECT_EQ(1, mouse_view1->EnteredCalls());
EXPECT_EQ(0, mouse_view1->ExitedCalls()); EXPECT_EQ(0, mouse_view1->ExitedCalls());
...@@ -967,7 +985,7 @@ TEST_F(WidgetCaptureTest, MouseExitOnCaptureGrab) { ...@@ -967,7 +985,7 @@ TEST_F(WidgetCaptureTest, MouseExitOnCaptureGrab) {
// in addition to the one generated by Chrome. // in addition to the one generated by Chrome.
EXPECT_LT(0, mouse_view1->ExitedCalls()); EXPECT_LT(0, mouse_view1->ExitedCalls());
} }
#endif #endif // !defined(OS_CHROMEOS)
namespace { namespace {
...@@ -1006,7 +1024,7 @@ TEST_F(WidgetCaptureTest, SetCaptureToNonToplevel) { ...@@ -1006,7 +1024,7 @@ TEST_F(WidgetCaptureTest, SetCaptureToNonToplevel) {
Widget::InitParams child_params = Widget::InitParams child_params =
CreateParams(Widget::InitParams::TYPE_WINDOW_FRAMELESS); CreateParams(Widget::InitParams::TYPE_WINDOW_FRAMELESS);
child_params.parent = toplevel.GetNativeView(); child_params.parent = toplevel.GetNativeView();
child_params.context = toplevel.GetNativeView(); child_params.context = toplevel.GetNativeWindow();
child->Init(child_params); child->Init(child_params);
CaptureOnActivationObserver observer; CaptureOnActivationObserver observer;
...@@ -1083,7 +1101,7 @@ TEST_F(WidgetCaptureTest, MouseEventDispatchedToRightWindow) { ...@@ -1083,7 +1101,7 @@ TEST_F(WidgetCaptureTest, MouseEventDispatchedToRightWindow) {
EXPECT_TRUE(widget1.GetAndClearGotMouseEvent()); EXPECT_TRUE(widget1.GetAndClearGotMouseEvent());
EXPECT_FALSE(widget2.GetAndClearGotMouseEvent()); EXPECT_FALSE(widget2.GetAndClearGotMouseEvent());
} }
#endif #endif // defined(OS_WIN)
} // namespace test } // namespace test
} // namespace views } // namespace views
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment