| OLD | NEW |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |