| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "testing/gtest/include/gtest/gtest.h" | |
| 6 | |
| 7 #include "base/logging.h" | 5 #include "base/logging.h" |
| 8 #include "base/string16.h" | 6 #include "base/string16.h" |
| 9 #include "base/string_number_conversions.h" | 7 #include "base/string_number_conversions.h" |
| 10 #include "base/utf_string_conversions.h" | 8 #include "base/utf_string_conversions.h" |
| 11 #include "third_party/skia/include/core/SkColor.h" | 9 #include "third_party/skia/include/core/SkColor.h" |
| 12 #include "ui/base/keycodes/keyboard_codes.h" | 10 #include "ui/base/keycodes/keyboard_codes.h" |
| 13 #include "ui/base/models/combobox_model.h" | 11 #include "ui/base/models/combobox_model.h" |
| 14 #include "ui/gfx/rect.h" | 12 #include "ui/gfx/rect.h" |
| 15 #include "views/background.h" | 13 #include "views/background.h" |
| 16 #include "views/border.h" | 14 #include "views/border.h" |
| 17 #include "views/controls/button/checkbox.h" | 15 #include "views/controls/button/checkbox.h" |
| 18 #include "views/controls/button/radio_button.h" | 16 #include "views/controls/button/radio_button.h" |
| 19 #include "views/controls/combobox/combobox.h" | 17 #include "views/controls/combobox/combobox.h" |
| 20 #include "views/controls/combobox/native_combobox_wrapper.h" | 18 #include "views/controls/combobox/native_combobox_wrapper.h" |
| 21 #include "views/controls/label.h" | 19 #include "views/controls/label.h" |
| 22 #include "views/controls/link.h" | 20 #include "views/controls/link.h" |
| 23 #include "views/controls/native/native_view_host.h" | 21 #include "views/controls/native/native_view_host.h" |
| 24 #include "views/controls/scroll_view.h" | 22 #include "views/controls/scroll_view.h" |
| 25 #include "views/controls/tabbed_pane/native_tabbed_pane_wrapper.h" | 23 #include "views/controls/tabbed_pane/native_tabbed_pane_wrapper.h" |
| 26 #include "views/controls/tabbed_pane/tabbed_pane.h" | 24 #include "views/controls/tabbed_pane/tabbed_pane.h" |
| 27 #include "views/controls/textfield/textfield.h" | 25 #include "views/controls/textfield/textfield.h" |
| 28 #include "views/focus/accelerator_handler.h" | 26 #include "views/focus/accelerator_handler.h" |
| 29 #include "views/focus/focus_manager_factory.h" | 27 #include "views/focus/focus_manager_factory.h" |
| 28 #include "views/test/views_test_base.h" |
| 30 #include "views/widget/root_view.h" | 29 #include "views/widget/root_view.h" |
| 31 #include "views/widget/widget.h" | 30 #include "views/widget/widget.h" |
| 32 #include "views/widget/widget_delegate.h" | 31 #include "views/widget/widget_delegate.h" |
| 33 #include "views/window/non_client_view.h" | 32 #include "views/window/non_client_view.h" |
| 34 | 33 |
| 35 #if defined(OS_LINUX) | 34 #if defined(OS_LINUX) |
| 36 #include "ui/base/keycodes/keyboard_code_conversion_gtk.h" | 35 #include "ui/base/keycodes/keyboard_code_conversion_gtk.h" |
| 37 #endif | 36 #endif |
| 38 | 37 |
| 39 namespace { | 38 namespace { |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 93 const int kHelpLinkID = count++; | 92 const int kHelpLinkID = count++; |
| 94 | 93 |
| 95 const int kThumbnailContainerID = count++; // 45 | 94 const int kThumbnailContainerID = count++; // 45 |
| 96 const int kThumbnailStarID = count++; | 95 const int kThumbnailStarID = count++; |
| 97 const int kThumbnailSuperStarID = count++; | 96 const int kThumbnailSuperStarID = count++; |
| 98 | 97 |
| 99 } // namespace | 98 } // namespace |
| 100 | 99 |
| 101 namespace views { | 100 namespace views { |
| 102 | 101 |
| 103 class FocusManagerTest : public testing::Test, public WidgetDelegate { | 102 class FocusManagerTest : public ViewsTestBase, public WidgetDelegate { |
| 104 public: | 103 public: |
| 105 FocusManagerTest() | 104 FocusManagerTest() |
| 106 : window_(NULL), | 105 : window_(NULL), |
| 107 content_view_(NULL), | 106 content_view_(NULL), |
| 108 focus_change_listener_(NULL) { | 107 focus_change_listener_(NULL) { |
| 109 #if defined(OS_WIN) | |
| 110 OleInitialize(NULL); | |
| 111 #endif | |
| 112 } | 108 } |
| 113 | 109 |
| 114 ~FocusManagerTest() { | 110 ~FocusManagerTest() { |
| 115 #if defined(OS_WIN) | |
| 116 OleUninitialize(); | |
| 117 #endif | |
| 118 } | 111 } |
| 119 | 112 |
| 120 virtual void SetUp() OVERRIDE { | 113 virtual void SetUp() OVERRIDE { |
| 114 ViewsTestBase::SetUp(); |
| 121 window_ = Widget::CreateWindowWithBounds(this, bounds()); | 115 window_ = Widget::CreateWindowWithBounds(this, bounds()); |
| 122 InitContentView(); | 116 InitContentView(); |
| 123 window_->Show(); | 117 window_->Show(); |
| 124 } | 118 } |
| 125 | 119 |
| 126 virtual void TearDown() OVERRIDE { | 120 virtual void TearDown() OVERRIDE { |
| 127 if (focus_change_listener_) | 121 if (focus_change_listener_) |
| 128 GetFocusManager()->RemoveFocusChangeListener(focus_change_listener_); | 122 GetFocusManager()->RemoveFocusChangeListener(focus_change_listener_); |
| 129 window_->Close(); | 123 window_->Close(); |
| 130 | 124 |
| 131 // Flush the message loop to make application verifiers happy. | 125 // Flush the message loop to make application verifiers happy. |
| 132 message_loop()->RunAllPending(); | 126 RunPendingMessages(); |
| 127 ViewsTestBase::TearDown(); |
| 133 } | 128 } |
| 134 | 129 |
| 135 FocusManager* GetFocusManager() { | 130 FocusManager* GetFocusManager() { |
| 136 return window_->GetFocusManager(); | 131 return window_->GetFocusManager(); |
| 137 } | 132 } |
| 138 | 133 |
| 139 void FocusNativeView(gfx::NativeView native_view) { | 134 void FocusNativeView(gfx::NativeView native_view) { |
| 140 #if defined(OS_WIN) | 135 #if defined(OS_WIN) |
| 141 ::SendMessage(native_view, WM_SETFOCUS, NULL, NULL); | 136 ::SendMessage(native_view, WM_SETFOCUS, NULL, NULL); |
| 142 #else | 137 #else |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 186 void SimulateDeactivateWindow() { | 181 void SimulateDeactivateWindow() { |
| 187 #if defined(OS_WIN) | 182 #if defined(OS_WIN) |
| 188 ::SendMessage(window_->GetNativeWindow(), WM_ACTIVATE, WA_INACTIVE, NULL); | 183 ::SendMessage(window_->GetNativeWindow(), WM_ACTIVATE, WA_INACTIVE, NULL); |
| 189 #else | 184 #else |
| 190 gboolean result; | 185 gboolean result; |
| 191 g_signal_emit_by_name(G_OBJECT(window_->GetNativeWindow()), | 186 g_signal_emit_by_name(G_OBJECT(window_->GetNativeWindow()), |
| 192 "focus_out_event", 0, & result); | 187 "focus_out_event", 0, & result); |
| 193 #endif | 188 #endif |
| 194 } | 189 } |
| 195 | 190 |
| 196 MessageLoopForUI* message_loop() { return &message_loop_; } | |
| 197 | |
| 198 Widget* window_; | 191 Widget* window_; |
| 199 View* content_view_; | 192 View* content_view_; |
| 200 | 193 |
| 201 void AddFocusChangeListener(FocusChangeListener* listener) { | 194 void AddFocusChangeListener(FocusChangeListener* listener) { |
| 202 ASSERT_FALSE(focus_change_listener_); | 195 ASSERT_FALSE(focus_change_listener_); |
| 203 focus_change_listener_ = listener; | 196 focus_change_listener_ = listener; |
| 204 GetFocusManager()->AddFocusChangeListener(listener); | 197 GetFocusManager()->AddFocusChangeListener(listener); |
| 205 } | 198 } |
| 206 | 199 |
| 207 #if defined(OS_WIN) | 200 #if defined(OS_WIN) |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 249 | 242 |
| 250 g_free(keys); | 243 g_free(keys); |
| 251 | 244 |
| 252 gdk_event_put(event); | 245 gdk_event_put(event); |
| 253 gdk_event_free(event); | 246 gdk_event_free(event); |
| 254 } | 247 } |
| 255 #endif | 248 #endif |
| 256 | 249 |
| 257 private: | 250 private: |
| 258 FocusChangeListener* focus_change_listener_; | 251 FocusChangeListener* focus_change_listener_; |
| 259 MessageLoopForUI message_loop_; | |
| 260 | 252 |
| 261 DISALLOW_COPY_AND_ASSIGN(FocusManagerTest); | 253 DISALLOW_COPY_AND_ASSIGN(FocusManagerTest); |
| 262 }; | 254 }; |
| 263 | 255 |
| 264 // BorderView is a view containing a native window with its own view hierarchy. | 256 // BorderView is a view containing a native window with its own view hierarchy. |
| 265 // It is interesting to test focus traversal from a view hierarchy to an inner | 257 // It is interesting to test focus traversal from a view hierarchy to an inner |
| 266 // view hierarchy. | 258 // view hierarchy. |
| 267 class BorderView : public NativeViewHost { | 259 class BorderView : public NativeViewHost { |
| 268 public: | 260 public: |
| 269 explicit BorderView(View* child) : child_(child), widget_(NULL) { | 261 explicit BorderView(View* child) : child_(child), widget_(NULL) { |
| (...skipping 686 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 956 // Simulate an activate, otherwise the deactivate isn't going to do anything. | 948 // Simulate an activate, otherwise the deactivate isn't going to do anything. |
| 957 SimulateActivateWindow(); | 949 SimulateActivateWindow(); |
| 958 | 950 |
| 959 NativeTextButton* button = new NativeTextButton(NULL, L"Press me"); | 951 NativeTextButton* button = new NativeTextButton(NULL, L"Press me"); |
| 960 View* view = new View(); | 952 View* view = new View(); |
| 961 view->set_focusable(true); | 953 view->set_focusable(true); |
| 962 | 954 |
| 963 content_view_->AddChildView(button); | 955 content_view_->AddChildView(button); |
| 964 button->SetBounds(10, 10, 200, 30); | 956 button->SetBounds(10, 10, 200, 30); |
| 965 content_view_->AddChildView(view); | 957 content_view_->AddChildView(view); |
| 966 message_loop()->RunAllPending(); | 958 RunPendingMessages(); |
| 967 | 959 |
| 968 TestFocusChangeListener listener; | 960 TestFocusChangeListener listener; |
| 969 AddFocusChangeListener(&listener); | 961 AddFocusChangeListener(&listener); |
| 970 | 962 |
| 971 view->RequestFocus(); | 963 view->RequestFocus(); |
| 972 message_loop()->RunAllPending(); | 964 RunPendingMessages(); |
| 973 // MessageLoopForUI::current()->Run(new AcceleratorHandler()); | 965 // MessageLoopForUI::current()->Run(new AcceleratorHandler()); |
| 974 | 966 |
| 975 // Visual Studio 2010 has problems converting NULL to the null pointer for | 967 // Visual Studio 2010 has problems converting NULL to the null pointer for |
| 976 // std::pair. See http://connect.microsoft.com/VisualStudio/feedback/details/
520043/error-converting-from-null-to-a-pointer-type-in-std-pair | 968 // std::pair. See http://connect.microsoft.com/VisualStudio/feedback/details/
520043/error-converting-from-null-to-a-pointer-type-in-std-pair |
| 977 // It will work if we pass nullptr. | 969 // It will work if we pass nullptr. |
| 978 #if defined(_MSC_VER) && _MSC_VER >= 1600 | 970 #if defined(_MSC_VER) && _MSC_VER >= 1600 |
| 979 views::View* null_view = nullptr; | 971 views::View* null_view = nullptr; |
| 980 #else | 972 #else |
| 981 views::View* null_view = NULL; | 973 views::View* null_view = NULL; |
| 982 #endif | 974 #endif |
| (...skipping 709 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1692 } | 1684 } |
| 1693 | 1685 |
| 1694 virtual ~WindowDtorTracked() { | 1686 virtual ~WindowDtorTracked() { |
| 1695 dtor_tracker_->push_back("WindowDtorTracked"); | 1687 dtor_tracker_->push_back("WindowDtorTracked"); |
| 1696 } | 1688 } |
| 1697 | 1689 |
| 1698 DtorTrackVector* dtor_tracker_; | 1690 DtorTrackVector* dtor_tracker_; |
| 1699 }; | 1691 }; |
| 1700 | 1692 |
| 1701 virtual void SetUp() { | 1693 virtual void SetUp() { |
| 1694 ViewsTestBase::SetUp(); |
| 1702 FocusManagerFactory::Install(new TestFocusManagerFactory(&dtor_tracker_)); | 1695 FocusManagerFactory::Install(new TestFocusManagerFactory(&dtor_tracker_)); |
| 1703 // Create WindowDtorTracked that uses FocusManagerDtorTracked. | 1696 // Create WindowDtorTracked that uses FocusManagerDtorTracked. |
| 1704 window_ = new WindowDtorTracked(&dtor_tracker_); | 1697 window_ = new WindowDtorTracked(&dtor_tracker_); |
| 1705 Widget::InitParams params; | 1698 Widget::InitParams params; |
| 1706 params.delegate = this; | 1699 params.delegate = this; |
| 1707 params.bounds = gfx::Rect(0, 0, 100, 100); | 1700 params.bounds = gfx::Rect(0, 0, 100, 100); |
| 1708 window_->Init(params); | 1701 window_->Init(params); |
| 1709 | 1702 |
| 1710 tracked_focus_manager_ = | 1703 tracked_focus_manager_ = |
| 1711 static_cast<FocusManagerDtorTracked*>(GetFocusManager()); | 1704 static_cast<FocusManagerDtorTracked*>(GetFocusManager()); |
| 1712 window_->Show(); | 1705 window_->Show(); |
| 1713 } | 1706 } |
| 1714 | 1707 |
| 1715 virtual void TearDown() { | 1708 virtual void TearDown() { |
| 1716 if (window_) { | 1709 if (window_) { |
| 1717 window_->Close(); | 1710 window_->Close(); |
| 1718 message_loop()->RunAllPending(); | 1711 RunPendingMessages(); |
| 1719 } | 1712 } |
| 1720 FocusManagerFactory::Install(NULL); | 1713 FocusManagerFactory::Install(NULL); |
| 1714 ViewsTestBase::TearDown(); |
| 1721 } | 1715 } |
| 1722 | 1716 |
| 1723 FocusManager* tracked_focus_manager_; | 1717 FocusManager* tracked_focus_manager_; |
| 1724 DtorTrackVector dtor_tracker_; | 1718 DtorTrackVector dtor_tracker_; |
| 1725 }; | 1719 }; |
| 1726 | 1720 |
| 1727 TEST_F(FocusManagerDtorTest, FocusManagerDestructedLast) { | 1721 TEST_F(FocusManagerDtorTest, FocusManagerDestructedLast) { |
| 1728 // Setup views hierarchy. | 1722 // Setup views hierarchy. |
| 1729 TabbedPane* tabbed_pane = new TabbedPane(); | 1723 TabbedPane* tabbed_pane = new TabbedPane(); |
| 1730 content_view_->AddChildView(tabbed_pane); | 1724 content_view_->AddChildView(tabbed_pane); |
| 1731 | 1725 |
| 1732 NativeButtonDtorTracked* button = new NativeButtonDtorTracked(L"button", | 1726 NativeButtonDtorTracked* button = new NativeButtonDtorTracked(L"button", |
| 1733 &dtor_tracker_); | 1727 &dtor_tracker_); |
| 1734 tabbed_pane->AddTab(L"Awesome tab", button); | 1728 tabbed_pane->AddTab(L"Awesome tab", button); |
| 1735 | 1729 |
| 1736 // Close the window. | 1730 // Close the window. |
| 1737 window_->Close(); | 1731 window_->Close(); |
| 1738 message_loop()->RunAllPending(); | 1732 RunPendingMessages(); |
| 1739 | 1733 |
| 1740 // Test window, button and focus manager should all be destructed. | 1734 // Test window, button and focus manager should all be destructed. |
| 1741 ASSERT_EQ(3, static_cast<int>(dtor_tracker_.size())); | 1735 ASSERT_EQ(3, static_cast<int>(dtor_tracker_.size())); |
| 1742 | 1736 |
| 1743 // Focus manager should be the last one to destruct. | 1737 // Focus manager should be the last one to destruct. |
| 1744 ASSERT_STREQ("FocusManagerDtorTracked", dtor_tracker_[2].c_str()); | 1738 ASSERT_STREQ("FocusManagerDtorTracked", dtor_tracker_[2].c_str()); |
| 1745 | 1739 |
| 1746 // Clear window_ so that we don't try to close it again. | 1740 // Clear window_ so that we don't try to close it again. |
| 1747 window_ = NULL; | 1741 window_ = NULL; |
| 1748 } | 1742 } |
| 1749 | 1743 |
| 1750 } // namespace views | 1744 } // namespace views |
| OLD | NEW |