Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(218)

Side by Side Diff: ui/views/widget/widget_interactive_uitest.cc

Issue 1776763002: Convert the flaky SysCommand widget tests into interactive ui tests. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | ui/views/widget/widget_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2013 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 <stddef.h> 5 #include <stddef.h>
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/command_line.h" 8 #include "base/command_line.h"
9 #include "base/macros.h" 9 #include "base/macros.h"
10 #include "base/path_service.h" 10 #include "base/path_service.h"
(...skipping 787 matching lines...) Expand 10 before | Expand all | Expand 10 after
798 798
799 gfx::Rect fullscreen_bounds_after_activate = 799 gfx::Rect fullscreen_bounds_after_activate =
800 widget1.GetWindowBoundsInScreen(); 800 widget1.GetWindowBoundsInScreen();
801 801
802 // After activation the bounds of the fullscreen widget should be restored. 802 // After activation the bounds of the fullscreen widget should be restored.
803 EXPECT_EQ(fullscreen_bounds, fullscreen_bounds_after_activate); 803 EXPECT_EQ(fullscreen_bounds, fullscreen_bounds_after_activate);
804 804
805 widget1.CloseNow(); 805 widget1.CloseNow();
806 widget2.CloseNow(); 806 widget2.CloseNow();
807 } 807 }
808
809 // Provides functionality to subclass a window and keep track of messages
810 // received.
811 class SubclassWindowHelper {
812 public:
813 explicit SubclassWindowHelper(HWND window)
814 : window_(window),
815 message_to_destroy_on_(0) {
816 EXPECT_EQ(instance_, nullptr);
817 instance_ = this;
818 EXPECT_TRUE(Subclass());
819 }
820
821 ~SubclassWindowHelper() {
822 Unsubclass();
823 instance_ = nullptr;
824 }
825
826 // Returns true if the |message| passed in was received.
827 bool received_message(unsigned int message) {
828 return (messages_.find(message) != messages_.end());
829 }
830
831 void Clear() {
832 messages_.clear();
833 }
834
835 void set_message_to_destroy_on(unsigned int message) {
836 message_to_destroy_on_ = message;
837 }
838
839 private:
840 bool Subclass() {
841 old_proc_ = reinterpret_cast<WNDPROC>(
842 ::SetWindowLongPtr(window_,
843 GWLP_WNDPROC,
844 reinterpret_cast<LONG_PTR>(WndProc)));
845 return old_proc_ != nullptr;
846 }
847
848 void Unsubclass() {
849 ::SetWindowLongPtr(window_,
850 GWLP_WNDPROC,
851 reinterpret_cast<LONG_PTR>(old_proc_));
852 }
853
854 static LRESULT CALLBACK WndProc(HWND window,
855 unsigned int message,
856 WPARAM w_param,
857 LPARAM l_param) {
858 EXPECT_NE(instance_, nullptr);
859 EXPECT_EQ(window, instance_->window_);
860
861 // Keep track of messags received for this window.
862 instance_->messages_.insert(message);
863
864 LRESULT ret = ::CallWindowProc(instance_->old_proc_, window, message,
865 w_param, l_param);
866 if (message == instance_->message_to_destroy_on_) {
867 instance_->Unsubclass();
868 ::DestroyWindow(window);
869 }
870 return ret;
871 }
872
873 WNDPROC old_proc_;
874 HWND window_;
875 static SubclassWindowHelper* instance_;
876 std::set<unsigned int> messages_;
877 unsigned int message_to_destroy_on_;
878
879 DISALLOW_COPY_AND_ASSIGN(SubclassWindowHelper);
880 };
881
882 SubclassWindowHelper* SubclassWindowHelper::instance_ = nullptr;
883
884 // This test validates whether the WM_SYSCOMMAND message for SC_MOVE is
885 // received when we post a WM_NCLBUTTONDOWN message for the caption in the
886 // following scenarios:-
887 // 1. Posting a WM_NCMOUSEMOVE message for a different location.
888 // 2. Posting a WM_NCMOUSEMOVE message with a different hittest code.
889 // 3. Posting a WM_MOUSEMOVE message.
890 TEST_F(WidgetTestInteractive,
891 SysCommandMoveOnNCLButtonDownOnCaptionAndMoveTest) {
892 Widget widget;
893 Widget::InitParams params =
894 CreateParams(Widget::InitParams::TYPE_WINDOW);
895 params.native_widget = new DesktopNativeWidgetAura(&widget);
896 params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
897 widget.Init(params);
898 widget.SetBounds(gfx::Rect(0, 0, 200, 200));
899 widget.Show();
900 ::SetCursorPos(500, 500);
901
902 HWND window = widget.GetNativeWindow()->GetHost()->GetAcceleratedWidget();
903
904 SubclassWindowHelper subclass_helper(window);
905
906 // Posting just a WM_NCLBUTTONDOWN message should not result in a
907 // WM_SYSCOMMAND
908 ::PostMessage(window, WM_NCLBUTTONDOWN, HTCAPTION, MAKELPARAM(100, 100));
909 RunPendingMessages();
910 EXPECT_TRUE(subclass_helper.received_message(WM_NCLBUTTONDOWN));
911 EXPECT_FALSE(subclass_helper.received_message(WM_SYSCOMMAND));
912
913 subclass_helper.Clear();
914 // Posting a WM_NCLBUTTONDOWN message followed by a WM_NCMOUSEMOVE at the
915 // same location should not result in a WM_SYSCOMMAND message.
916 ::PostMessage(window, WM_NCLBUTTONDOWN, HTCAPTION, MAKELPARAM(100, 100));
917 ::PostMessage(window, WM_NCMOUSEMOVE, HTCAPTION, MAKELPARAM(100, 100));
918 RunPendingMessages();
919
920 EXPECT_TRUE(subclass_helper.received_message(WM_NCLBUTTONDOWN));
921 EXPECT_TRUE(subclass_helper.received_message(WM_NCMOUSEMOVE));
922 EXPECT_FALSE(subclass_helper.received_message(WM_SYSCOMMAND));
923
924 subclass_helper.Clear();
925 // Posting a WM_NCLBUTTONDOWN message followed by a WM_NCMOUSEMOVE at a
926 // different location should result in a WM_SYSCOMMAND message.
927 ::PostMessage(window, WM_NCLBUTTONDOWN, HTCAPTION, MAKELPARAM(100, 100));
928 ::PostMessage(window, WM_NCMOUSEMOVE, HTCAPTION, MAKELPARAM(110, 110));
929 RunPendingMessages();
930
931 EXPECT_TRUE(subclass_helper.received_message(WM_NCLBUTTONDOWN));
932 EXPECT_TRUE(subclass_helper.received_message(WM_NCMOUSEMOVE));
933 EXPECT_TRUE(subclass_helper.received_message(WM_SYSCOMMAND));
934
935 subclass_helper.Clear();
936 // Posting a WM_NCLBUTTONDOWN message followed by a WM_NCMOUSEMOVE at a
937 // different location with a different hittest code should result in a
938 // WM_SYSCOMMAND message.
939 ::PostMessage(window, WM_NCLBUTTONDOWN, HTCAPTION, MAKELPARAM(100, 100));
940 ::PostMessage(window, WM_NCMOUSEMOVE, HTTOP, MAKELPARAM(110, 102));
941 RunPendingMessages();
942
943 EXPECT_TRUE(subclass_helper.received_message(WM_NCLBUTTONDOWN));
944 EXPECT_TRUE(subclass_helper.received_message(WM_NCMOUSEMOVE));
945 EXPECT_TRUE(subclass_helper.received_message(WM_SYSCOMMAND));
946
947 subclass_helper.Clear();
948 // Posting a WM_NCLBUTTONDOWN message followed by a WM_MOUSEMOVE should
949 // result in a WM_SYSCOMMAND message.
950 ::PostMessage(window, WM_NCLBUTTONDOWN, HTCAPTION, MAKELPARAM(100, 100));
951 ::PostMessage(window, WM_MOUSEMOVE, HTCLIENT, MAKELPARAM(110, 110));
952 RunPendingMessages();
953
954 EXPECT_TRUE(subclass_helper.received_message(WM_NCLBUTTONDOWN));
955 EXPECT_TRUE(subclass_helper.received_message(WM_MOUSEMOVE));
956 EXPECT_TRUE(subclass_helper.received_message(WM_SYSCOMMAND));
957
958 widget.CloseNow();
959 }
960
961 // This test validates that destroying the window in the context of the
962 // WM_SYSCOMMAND message with SC_MOVE does not crash.
963 TEST_F(WidgetTestInteractive, DestroyInSysCommandNCLButtonDownOnCaption) {
964 Widget widget;
965 Widget::InitParams params =
966 CreateParams(Widget::InitParams::TYPE_WINDOW);
967 params.native_widget = new DesktopNativeWidgetAura(&widget);
968 params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
969 widget.Init(params);
970 widget.SetBounds(gfx::Rect(0, 0, 200, 200));
971 widget.Show();
972 ::SetCursorPos(500, 500);
973
974 HWND window = widget.GetNativeWindow()->GetHost()->GetAcceleratedWidget();
975
976 SubclassWindowHelper subclass_helper(window);
977
978 // Destroying the window in the context of the WM_SYSCOMMAND message
979 // should not crash.
980 subclass_helper.set_message_to_destroy_on(WM_SYSCOMMAND);
981
982 ::PostMessage(window, WM_NCLBUTTONDOWN, HTCAPTION, MAKELPARAM(100, 100));
983 ::PostMessage(window, WM_NCMOUSEMOVE, HTCAPTION, MAKELPARAM(110, 110));
984 RunPendingMessages();
985
986 EXPECT_TRUE(subclass_helper.received_message(WM_NCLBUTTONDOWN));
987 EXPECT_TRUE(subclass_helper.received_message(WM_SYSCOMMAND));
988
989 widget.CloseNow();
990 }
808 #endif // defined(OS_WIN) 991 #endif // defined(OS_WIN)
809 992
810 #if !defined(OS_CHROMEOS) 993 #if !defined(OS_CHROMEOS)
811 // Provides functionality to create a window modal dialog. 994 // Provides functionality to create a window modal dialog.
812 class ModalDialogDelegate : public DialogDelegateView { 995 class ModalDialogDelegate : public DialogDelegateView {
813 public: 996 public:
814 explicit ModalDialogDelegate(ui::ModalType type) : type_(type) {} 997 explicit ModalDialogDelegate(ui::ModalType type) : type_(type) {}
815 ~ModalDialogDelegate() override {} 998 ~ModalDialogDelegate() override {}
816 999
817 // WidgetDelegate overrides. 1000 // WidgetDelegate overrides.
(...skipping 914 matching lines...) Expand 10 before | Expand all | Expand 10 after
1732 1915
1733 ui::KeyEvent key_event2(key_event); 1916 ui::KeyEvent key_event2(key_event);
1734 widget->OnKeyEvent(&key_event2); 1917 widget->OnKeyEvent(&key_event2);
1735 EXPECT_FALSE(key_event2.stopped_propagation()); 1918 EXPECT_FALSE(key_event2.stopped_propagation());
1736 1919
1737 widget->CloseNow(); 1920 widget->CloseNow();
1738 } 1921 }
1739 1922
1740 } // namespace test 1923 } // namespace test
1741 } // namespace views 1924 } // namespace views
OLDNEW
« no previous file with comments | « no previous file | ui/views/widget/widget_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698