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

Side by Side Diff: chrome/browser/ui/views/drag_and_drop_interactive_uitest.cc

Issue 2668583002: Regression test for disappearing drag source while drag is in progress. (Closed)
Patch Set: Created 3 years, 10 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 | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 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 <algorithm> 5 #include <algorithm>
6 #include <initializer_list> 6 #include <initializer_list>
7 #include <memory> 7 #include <memory>
8 #include <string> 8 #include <string>
9 #include <vector> 9 #include <vector>
10 10
(...skipping 499 matching lines...) Expand 10 before | Expand all | Expand 10 after
510 510
511 class DragAndDropBrowserTest : public InProcessBrowserTest, 511 class DragAndDropBrowserTest : public InProcessBrowserTest,
512 public testing::WithParamInterface<bool> { 512 public testing::WithParamInterface<bool> {
513 public: 513 public:
514 DragAndDropBrowserTest(){}; 514 DragAndDropBrowserTest(){};
515 515
516 struct DragImageBetweenFrames_TestState; 516 struct DragImageBetweenFrames_TestState;
517 void DragImageBetweenFrames_Step2(DragImageBetweenFrames_TestState*); 517 void DragImageBetweenFrames_Step2(DragImageBetweenFrames_TestState*);
518 void DragImageBetweenFrames_Step3(DragImageBetweenFrames_TestState*); 518 void DragImageBetweenFrames_Step3(DragImageBetweenFrames_TestState*);
519 519
520 struct DragImageFromDisappearingFrame_TestState;
521 void DragImageFromDisappearingFrame_Step2(
522 DragImageFromDisappearingFrame_TestState*);
523 void DragImageFromDisappearingFrame_Step3(
524 DragImageFromDisappearingFrame_TestState*);
525
520 struct CrossSiteDrag_TestState; 526 struct CrossSiteDrag_TestState;
521 void CrossSiteDrag_Step2(CrossSiteDrag_TestState*); 527 void CrossSiteDrag_Step2(CrossSiteDrag_TestState*);
522 void CrossSiteDrag_Step3(CrossSiteDrag_TestState*); 528 void CrossSiteDrag_Step3(CrossSiteDrag_TestState*);
523 529
524 protected: 530 protected:
525 void SetUpOnMainThread() override { 531 void SetUpOnMainThread() override {
526 host_resolver()->AddRule("*", "127.0.0.1"); 532 host_resolver()->AddRule("*", "127.0.0.1");
527 content::SetupCrossSiteRedirector(embedded_test_server()); 533 content::SetupCrossSiteRedirector(embedded_test_server());
528 ASSERT_TRUE(embedded_test_server()->Start()); 534 ASSERT_TRUE(embedded_test_server()->Start());
529 drag_simulator_.reset(new DragAndDropSimulator(web_contents())); 535 drag_simulator_.reset(new DragAndDropSimulator(web_contents()));
(...skipping 515 matching lines...) Expand 10 before | Expand all | Expand 10 after
1045 // right frame since the last checkpoint. 1051 // right frame since the last checkpoint.
1046 EXPECT_EQ( 1052 EXPECT_EQ(
1047 1, state->right_frame_events_counter->GetNumberOfReceivedEvents("drop")); 1053 1, state->right_frame_events_counter->GetNumberOfReceivedEvents("drop"));
1048 EXPECT_EQ(0, state->right_frame_events_counter->GetNumberOfReceivedEvents( 1054 EXPECT_EQ(0, state->right_frame_events_counter->GetNumberOfReceivedEvents(
1049 {"dragstart", "dragleave", "dragenter", "dragend"})); 1055 {"dragstart", "dragleave", "dragenter", "dragend"}));
1050 } 1056 }
1051 1057
1052 // There is no known way to execute test-controlled tasks during 1058 // There is no known way to execute test-controlled tasks during
1053 // a drag-and-drop loop run by Windows OS. 1059 // a drag-and-drop loop run by Windows OS.
1054 #if defined(OS_WIN) 1060 #if defined(OS_WIN)
1061 #define MAYBE_DragImageFromDisappearingFrame \
1062 DISABLED_DragImageFromDisappearingFrame
1063 #else
1064 #define MAYBE_DragImageFromDisappearingFrame DragImageFromDisappearingFrame
1065 #endif
1066
1067 // Data that needs to be shared across multiple test steps below
1068 // (i.e. across DragImageFromDisappearingFrame_Step2 and
1069 // DragImageFromDisappearingFrame_Step3).
1070 struct DragAndDropBrowserTest::DragImageFromDisappearingFrame_TestState {
1071 DOMDragEventVerifier expected_dom_event_data;
1072 std::unique_ptr<DOMDragEventWaiter> drop_event_waiter;
1073 };
1074
1075 // Scenario: drag an image from the left into the right frame and delete the
1076 // left frame during the drag. This is a regression test for
1077 // https://crbug.com/670123.
1078 // Test coverage: dragenter, dragover, drop DOM events.
1079 IN_PROC_BROWSER_TEST_P(DragAndDropBrowserTest,
1080 MAYBE_DragImageFromDisappearingFrame) {
1081 // Load the test page.
1082 std::string frame_site = use_cross_site_subframe() ? "b.com" : "a.com";
1083 ASSERT_TRUE(NavigateToTestPage("a.com"));
1084 ASSERT_TRUE(NavigateLeftFrame(frame_site, "image_source.html"));
1085 ASSERT_TRUE(NavigateRightFrame(frame_site, "drop_target.html"));
1086
1087 // Setup test expectations.
1088 DragAndDropBrowserTest::DragImageFromDisappearingFrame_TestState state;
1089 state.expected_dom_event_data.set_expected_drop_effect("none");
1090 // (dragstart event handler in image_source.html is asking for "copy" only).
1091 state.expected_dom_event_data.set_expected_effect_allowed("copy");
1092 state.expected_dom_event_data.set_expected_mime_types(
1093 "text/html,text/plain,text/uri-list");
1094 state.expected_dom_event_data.set_expected_client_position("(155, 150)");
1095 state.expected_dom_event_data.set_expected_page_position("(155, 150)");
1096
1097 // Start the drag in the left frame.
1098 DragStartWaiter drag_start_waiter(web_contents());
1099 drag_start_waiter.PostTaskWhenDragStarts(
1100 base::Bind(&DragAndDropBrowserTest::DragImageFromDisappearingFrame_Step2,
1101 base::Unretained(this), base::Unretained(&state)));
1102 EXPECT_TRUE(SimulateMouseDownAndDragStartInLeftFrame());
1103
1104 // The next step of the test (DragImageFromDisappearingFrame_Step2) runs
1105 // inside the nested drag-and-drop message loop - the call below won't return
1106 // until the drag-and-drop has already ended.
1107 drag_start_waiter.WaitUntilDragStart(nullptr, nullptr, nullptr, nullptr);
1108
1109 DragImageFromDisappearingFrame_Step3(&state);
1110 }
1111
1112 void DragAndDropBrowserTest::DragImageFromDisappearingFrame_Step2(
1113 DragAndDropBrowserTest::DragImageFromDisappearingFrame_TestState* state) {
1114 // Delete the left frame in an attempt to repro https://crbug.com/670123.
1115 content::RenderFrameDeletedObserver frame_deleted_observer(left_frame());
1116 ASSERT_TRUE(ExecuteScript(web_contents()->GetMainFrame(),
1117 "frame = document.getElementById('left');\n"
1118 "frame.parentNode.removeChild(frame);\n"));
1119 frame_deleted_observer.WaitUntilDeleted();
1120
1121 // While dragging, move mouse from the left into the right frame.
1122 // This should trigger dragleave and dragenter events.
1123 {
1124 DOMDragEventWaiter dragenter_event_waiter("dragenter", right_frame());
1125 ASSERT_TRUE(SimulateMouseMoveToRightFrame());
1126
1127 { // Verify dragenter DOM event.
1128 std::string dragenter_event;
1129 EXPECT_TRUE(
1130 dragenter_event_waiter.WaitForNextMatchingEvent(&dragenter_event));
1131 EXPECT_THAT(dragenter_event, state->expected_dom_event_data.Matches());
1132 }
1133
1134 // Note that ash (unlike aura/x11) will not fire dragover event in response
1135 // to the same mouse event that trigerred a dragenter. Because of that, we
1136 // postpone dragover testing until the next test step below. See
1137 // implementation of ash::DragDropController::DragUpdate for details.
1138 }
1139
1140 // Move the mouse twice in the right frame. The 1st move will ensure that
1141 // allowed operations communicated by the renderer will be stored in
1142 // WebContentsViewAura::current_drag_op_. The 2nd move will ensure that this
1143 // gets be copied into DesktopDragDropClientAuraX11::negotiated_operation_.
1144 for (int i = 0; i < 2; i++) {
1145 DOMDragEventWaiter dragover_event_waiter("dragover", right_frame());
1146 ASSERT_TRUE(SimulateMouseMoveToRightFrame());
1147
1148 { // Verify dragover DOM event.
1149 std::string dragover_event;
1150 EXPECT_TRUE(
1151 dragover_event_waiter.WaitForNextMatchingEvent(&dragover_event));
1152 EXPECT_THAT(dragover_event, state->expected_dom_event_data.Matches());
1153 }
1154 }
1155
1156 // Release the mouse button to end the drag.
1157 state->drop_event_waiter.reset(new DOMDragEventWaiter("drop", right_frame()));
1158 SimulateMouseUp();
1159 // The test will continue in DragImageFromDisappearingFrame_Step3.
1160 }
1161
1162 void DragAndDropBrowserTest::DragImageFromDisappearingFrame_Step3(
1163 DragAndDropBrowserTest::DragImageFromDisappearingFrame_TestState* state) {
1164 // Verify drop DOM event.
1165 {
1166 std::string drop_event;
1167 EXPECT_TRUE(
1168 state->drop_event_waiter->WaitForNextMatchingEvent(&drop_event));
1169 state->drop_event_waiter.reset();
1170 EXPECT_THAT(drop_event, state->expected_dom_event_data.Matches());
1171 }
1172 }
1173
1174 // There is no known way to execute test-controlled tasks during
1175 // a drag-and-drop loop run by Windows OS.
1176 #if defined(OS_WIN)
1055 #define MAYBE_CrossSiteDrag DISABLED_CrossSiteDrag 1177 #define MAYBE_CrossSiteDrag DISABLED_CrossSiteDrag
1056 #else 1178 #else
1057 #define MAYBE_CrossSiteDrag CrossSiteDrag 1179 #define MAYBE_CrossSiteDrag CrossSiteDrag
1058 #endif 1180 #endif
1059 1181
1060 // Data that needs to be shared across multiple test steps below 1182 // Data that needs to be shared across multiple test steps below
1061 // (i.e. across CrossSiteDrag_Step2 and CrossSiteDrag_Step3). 1183 // (i.e. across CrossSiteDrag_Step2 and CrossSiteDrag_Step3).
1062 struct DragAndDropBrowserTest::CrossSiteDrag_TestState { 1184 struct DragAndDropBrowserTest::CrossSiteDrag_TestState {
1063 std::unique_ptr<DOMDragEventWaiter> dragend_event_waiter; 1185 std::unique_ptr<DOMDragEventWaiter> dragend_event_waiter;
1064 std::unique_ptr<DOMDragEventCounter> left_frame_events_counter; 1186 std::unique_ptr<DOMDragEventCounter> left_frame_events_counter;
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after
1162 // of a drag operation, and cross-site drags should be allowed across a 1284 // of a drag operation, and cross-site drags should be allowed across a
1163 // navigation. 1285 // navigation.
1164 1286
1165 INSTANTIATE_TEST_CASE_P( 1287 INSTANTIATE_TEST_CASE_P(
1166 SameSiteSubframe, DragAndDropBrowserTest, ::testing::Values(false)); 1288 SameSiteSubframe, DragAndDropBrowserTest, ::testing::Values(false));
1167 1289
1168 INSTANTIATE_TEST_CASE_P( 1290 INSTANTIATE_TEST_CASE_P(
1169 CrossSiteSubframe, DragAndDropBrowserTest, ::testing::Values(true)); 1291 CrossSiteSubframe, DragAndDropBrowserTest, ::testing::Values(true));
1170 1292
1171 } // namespace chrome 1293 } // namespace chrome
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698