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

Side by Side Diff: third_party/WebKit/Source/core/input/EventHandler.cpp

Issue 2842483002: Set relatedtarget for dragleave/enter events (Closed)
Patch Set: Add event sender input automation Created 3 years, 7 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
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights 2 * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights
3 * reserved. 3 * reserved.
4 * Copyright (C) 2006 Alexey Proskuryakov (ap@webkit.org) 4 * Copyright (C) 2006 Alexey Proskuryakov (ap@webkit.org)
5 * Copyright (C) 2012 Digia Plc. and/or its subsidiary(-ies) 5 * Copyright (C) 2012 Digia Plc. and/or its subsidiary(-ies)
6 * 6 *
7 * Redistribution and use in source and binary forms, with or without 7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions 8 * modification, are permitted provided that the following conditions
9 * are met: 9 * are met:
10 * 1. Redistributions of source code must retain the above copyright 10 * 1. Redistributions of source code must retain the above copyright
(...skipping 1053 matching lines...) Expand 10 before | Expand all | Expand 10 after
1064 event, data_transfer); 1064 event, data_transfer);
1065 } else if (new_target) { 1065 } else if (new_target) {
1066 // As per section 7.9.4 of the HTML 5 spec., we must always fire a drag 1066 // As per section 7.9.4 of the HTML 5 spec., we must always fire a drag
1067 // event before firing a dragenter, dragleave, or dragover event. 1067 // event before firing a dragenter, dragleave, or dragover event.
1068 if (mouse_event_manager_->GetDragState().drag_src_) { 1068 if (mouse_event_manager_->GetDragState().drag_src_) {
1069 // For now we don't care if event handler cancels default behavior, 1069 // For now we don't care if event handler cancels default behavior,
1070 // since there is none. 1070 // since there is none.
1071 mouse_event_manager_->DispatchDragSrcEvent(EventTypeNames::drag, event); 1071 mouse_event_manager_->DispatchDragSrcEvent(EventTypeNames::drag, event);
1072 } 1072 }
1073 event_result = mouse_event_manager_->DispatchDragEvent( 1073 event_result = mouse_event_manager_->DispatchDragEvent(
1074 EventTypeNames::dragenter, new_target, event, data_transfer); 1074 EventTypeNames::dragenter, new_target, drag_target_, event,
1075 data_transfer);
1075 } 1076 }
1076 1077
1077 if (TargetIsFrame(drag_target_.Get(), target_frame)) { 1078 if (TargetIsFrame(drag_target_.Get(), target_frame)) {
1078 if (target_frame) 1079 if (target_frame)
1079 event_result = target_frame->GetEventHandler().UpdateDragAndDrop( 1080 event_result = target_frame->GetEventHandler().UpdateDragAndDrop(
1080 event, data_transfer); 1081 event, data_transfer);
1081 } else if (drag_target_) { 1082 } else if (drag_target_) {
1082 mouse_event_manager_->DispatchDragEvent( 1083 mouse_event_manager_->DispatchDragEvent(EventTypeNames::dragleave,
1083 EventTypeNames::dragleave, drag_target_.Get(), event, data_transfer); 1084 drag_target_.Get(), new_target,
1085 event, data_transfer);
1084 } 1086 }
1085 1087
1086 if (new_target) { 1088 if (new_target) {
1087 // We do not explicitly call m_mouseEventManager->dispatchDragEvent here 1089 // We do not explicitly call m_mouseEventManager->dispatchDragEvent here
1088 // because it could ultimately result in the appearance that two dragover 1090 // because it could ultimately result in the appearance that two dragover
1089 // events fired. So, we mark that we should only fire a dragover event on 1091 // events fired. So, we mark that we should only fire a dragover event on
1090 // the next call to this function. 1092 // the next call to this function.
1091 should_only_fire_drag_over_event_ = true; 1093 should_only_fire_drag_over_event_ = true;
1092 } 1094 }
1093 } else { 1095 } else {
1094 LocalFrame* target_frame; 1096 LocalFrame* target_frame;
1095 if (TargetIsFrame(new_target, target_frame)) { 1097 if (TargetIsFrame(new_target, target_frame)) {
1096 if (target_frame) 1098 if (target_frame)
1097 event_result = target_frame->GetEventHandler().UpdateDragAndDrop( 1099 event_result = target_frame->GetEventHandler().UpdateDragAndDrop(
1098 event, data_transfer); 1100 event, data_transfer);
1099 } else if (new_target) { 1101 } else if (new_target) {
1100 // Note, when dealing with sub-frames, we may need to fire only a dragover 1102 // Note, when dealing with sub-frames, we may need to fire only a dragover
1101 // event as a drag event may have been fired earlier. 1103 // event as a drag event may have been fired earlier.
1102 if (!should_only_fire_drag_over_event_ && 1104 if (!should_only_fire_drag_over_event_ &&
1103 mouse_event_manager_->GetDragState().drag_src_) { 1105 mouse_event_manager_->GetDragState().drag_src_) {
1104 // For now we don't care if event handler cancels default behavior, 1106 // For now we don't care if event handler cancels default behavior,
1105 // since there is none. 1107 // since there is none.
1106 mouse_event_manager_->DispatchDragSrcEvent(EventTypeNames::drag, event); 1108 mouse_event_manager_->DispatchDragSrcEvent(EventTypeNames::drag, event);
1107 } 1109 }
1108 event_result = mouse_event_manager_->DispatchDragEvent( 1110 event_result = mouse_event_manager_->DispatchDragEvent(
1109 EventTypeNames::dragover, new_target, event, data_transfer); 1111 EventTypeNames::dragover, new_target, nullptr, event, data_transfer);
1110 should_only_fire_drag_over_event_ = false; 1112 should_only_fire_drag_over_event_ = false;
1111 } 1113 }
1112 } 1114 }
1113 drag_target_ = new_target; 1115 drag_target_ = new_target;
1114 1116
1115 return event_result; 1117 return event_result;
1116 } 1118 }
1117 1119
1118 void EventHandler::CancelDragAndDrop(const WebMouseEvent& event, 1120 void EventHandler::CancelDragAndDrop(const WebMouseEvent& event,
1119 DataTransfer* data_transfer) { 1121 DataTransfer* data_transfer) {
1120 LocalFrame* target_frame; 1122 LocalFrame* target_frame;
1121 if (TargetIsFrame(drag_target_.Get(), target_frame)) { 1123 if (TargetIsFrame(drag_target_.Get(), target_frame)) {
1122 if (target_frame) 1124 if (target_frame)
1123 target_frame->GetEventHandler().CancelDragAndDrop(event, data_transfer); 1125 target_frame->GetEventHandler().CancelDragAndDrop(event, data_transfer);
1124 } else if (drag_target_.Get()) { 1126 } else if (drag_target_.Get()) {
1125 if (mouse_event_manager_->GetDragState().drag_src_) 1127 if (mouse_event_manager_->GetDragState().drag_src_)
1126 mouse_event_manager_->DispatchDragSrcEvent(EventTypeNames::drag, event); 1128 mouse_event_manager_->DispatchDragSrcEvent(EventTypeNames::drag, event);
1127 mouse_event_manager_->DispatchDragEvent( 1129 mouse_event_manager_->DispatchDragEvent(EventTypeNames::dragleave,
1128 EventTypeNames::dragleave, drag_target_.Get(), event, data_transfer); 1130 drag_target_.Get(), nullptr, event,
1131 data_transfer);
1129 } 1132 }
1130 ClearDragState(); 1133 ClearDragState();
1131 } 1134 }
1132 1135
1133 WebInputEventResult EventHandler::PerformDragAndDrop( 1136 WebInputEventResult EventHandler::PerformDragAndDrop(
1134 const WebMouseEvent& event, 1137 const WebMouseEvent& event,
1135 DataTransfer* data_transfer) { 1138 DataTransfer* data_transfer) {
1136 LocalFrame* target_frame; 1139 LocalFrame* target_frame;
1137 WebInputEventResult result = WebInputEventResult::kNotHandled; 1140 WebInputEventResult result = WebInputEventResult::kNotHandled;
1138 if (TargetIsFrame(drag_target_.Get(), target_frame)) { 1141 if (TargetIsFrame(drag_target_.Get(), target_frame)) {
1139 if (target_frame) 1142 if (target_frame)
1140 result = target_frame->GetEventHandler().PerformDragAndDrop( 1143 result = target_frame->GetEventHandler().PerformDragAndDrop(
1141 event, data_transfer); 1144 event, data_transfer);
1142 } else if (drag_target_.Get()) { 1145 } else if (drag_target_.Get()) {
1143 result = mouse_event_manager_->DispatchDragEvent( 1146 result = mouse_event_manager_->DispatchDragEvent(
1144 EventTypeNames::drop, drag_target_.Get(), event, data_transfer); 1147 EventTypeNames::drop, drag_target_.Get(), nullptr, event,
1148 data_transfer);
1145 } 1149 }
1146 ClearDragState(); 1150 ClearDragState();
1147 return result; 1151 return result;
1148 } 1152 }
1149 1153
1150 void EventHandler::ClearDragState() { 1154 void EventHandler::ClearDragState() {
1151 scroll_manager_->StopAutoscroll(); 1155 scroll_manager_->StopAutoscroll();
1152 drag_target_ = nullptr; 1156 drag_target_ = nullptr;
1153 capturing_mouse_events_node_ = nullptr; 1157 capturing_mouse_events_node_ = nullptr;
1154 should_only_fire_drag_over_event_ = false; 1158 should_only_fire_drag_over_event_ = false;
(...skipping 962 matching lines...) Expand 10 before | Expand all | Expand 10 after
2117 MouseEventWithHitTestResults& mev, 2121 MouseEventWithHitTestResults& mev,
2118 LocalFrame* subframe) { 2122 LocalFrame* subframe) {
2119 WebInputEventResult result = 2123 WebInputEventResult result =
2120 subframe->GetEventHandler().HandleMouseReleaseEvent(mev.Event()); 2124 subframe->GetEventHandler().HandleMouseReleaseEvent(mev.Event());
2121 if (result != WebInputEventResult::kNotHandled) 2125 if (result != WebInputEventResult::kNotHandled)
2122 return result; 2126 return result;
2123 return WebInputEventResult::kHandledSystem; 2127 return WebInputEventResult::kHandledSystem;
2124 } 2128 }
2125 2129
2126 } // namespace blink 2130 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698