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

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

Issue 2842483002: Set relatedtarget for dragleave/enter events (Closed)
Patch Set: Fix test title 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 1045 matching lines...) Expand 10 before | Expand all | Expand 10 after
1056 event, data_transfer); 1056 event, data_transfer);
1057 } else if (new_target) { 1057 } else if (new_target) {
1058 // As per section 7.9.4 of the HTML 5 spec., we must always fire a drag 1058 // As per section 7.9.4 of the HTML 5 spec., we must always fire a drag
1059 // event before firing a dragenter, dragleave, or dragover event. 1059 // event before firing a dragenter, dragleave, or dragover event.
1060 if (mouse_event_manager_->GetDragState().drag_src_) { 1060 if (mouse_event_manager_->GetDragState().drag_src_) {
1061 // For now we don't care if event handler cancels default behavior, 1061 // For now we don't care if event handler cancels default behavior,
1062 // since there is none. 1062 // since there is none.
1063 mouse_event_manager_->DispatchDragSrcEvent(EventTypeNames::drag, event); 1063 mouse_event_manager_->DispatchDragSrcEvent(EventTypeNames::drag, event);
1064 } 1064 }
1065 event_result = mouse_event_manager_->DispatchDragEvent( 1065 event_result = mouse_event_manager_->DispatchDragEvent(
1066 EventTypeNames::dragenter, new_target, event, data_transfer); 1066 EventTypeNames::dragenter, new_target, drag_target_, event,
1067 data_transfer);
1067 } 1068 }
1068 1069
1069 if (TargetIsFrame(drag_target_.Get(), target_frame)) { 1070 if (TargetIsFrame(drag_target_.Get(), target_frame)) {
1070 if (target_frame) 1071 if (target_frame)
1071 event_result = target_frame->GetEventHandler().UpdateDragAndDrop( 1072 event_result = target_frame->GetEventHandler().UpdateDragAndDrop(
1072 event, data_transfer); 1073 event, data_transfer);
1073 } else if (drag_target_) { 1074 } else if (drag_target_) {
1074 mouse_event_manager_->DispatchDragEvent( 1075 mouse_event_manager_->DispatchDragEvent(EventTypeNames::dragleave,
1075 EventTypeNames::dragleave, drag_target_.Get(), event, data_transfer); 1076 drag_target_.Get(), new_target,
1077 event, data_transfer);
1076 } 1078 }
1077 1079
1078 if (new_target) { 1080 if (new_target) {
1079 // We do not explicitly call m_mouseEventManager->dispatchDragEvent here 1081 // We do not explicitly call m_mouseEventManager->dispatchDragEvent here
1080 // because it could ultimately result in the appearance that two dragover 1082 // because it could ultimately result in the appearance that two dragover
1081 // events fired. So, we mark that we should only fire a dragover event on 1083 // events fired. So, we mark that we should only fire a dragover event on
1082 // the next call to this function. 1084 // the next call to this function.
1083 should_only_fire_drag_over_event_ = true; 1085 should_only_fire_drag_over_event_ = true;
1084 } 1086 }
1085 } else { 1087 } else {
1086 LocalFrame* target_frame; 1088 LocalFrame* target_frame;
1087 if (TargetIsFrame(new_target, target_frame)) { 1089 if (TargetIsFrame(new_target, target_frame)) {
1088 if (target_frame) 1090 if (target_frame)
1089 event_result = target_frame->GetEventHandler().UpdateDragAndDrop( 1091 event_result = target_frame->GetEventHandler().UpdateDragAndDrop(
1090 event, data_transfer); 1092 event, data_transfer);
1091 } else if (new_target) { 1093 } else if (new_target) {
1092 // Note, when dealing with sub-frames, we may need to fire only a dragover 1094 // Note, when dealing with sub-frames, we may need to fire only a dragover
1093 // event as a drag event may have been fired earlier. 1095 // event as a drag event may have been fired earlier.
1094 if (!should_only_fire_drag_over_event_ && 1096 if (!should_only_fire_drag_over_event_ &&
1095 mouse_event_manager_->GetDragState().drag_src_) { 1097 mouse_event_manager_->GetDragState().drag_src_) {
1096 // For now we don't care if event handler cancels default behavior, 1098 // For now we don't care if event handler cancels default behavior,
1097 // since there is none. 1099 // since there is none.
1098 mouse_event_manager_->DispatchDragSrcEvent(EventTypeNames::drag, event); 1100 mouse_event_manager_->DispatchDragSrcEvent(EventTypeNames::drag, event);
1099 } 1101 }
1100 event_result = mouse_event_manager_->DispatchDragEvent( 1102 event_result = mouse_event_manager_->DispatchDragEvent(
1101 EventTypeNames::dragover, new_target, event, data_transfer); 1103 EventTypeNames::dragover, new_target, nullptr, event, data_transfer);
1102 should_only_fire_drag_over_event_ = false; 1104 should_only_fire_drag_over_event_ = false;
1103 } 1105 }
1104 } 1106 }
1105 drag_target_ = new_target; 1107 drag_target_ = new_target;
1106 1108
1107 return event_result; 1109 return event_result;
1108 } 1110 }
1109 1111
1110 void EventHandler::CancelDragAndDrop(const WebMouseEvent& event, 1112 void EventHandler::CancelDragAndDrop(const WebMouseEvent& event,
1111 DataTransfer* data_transfer) { 1113 DataTransfer* data_transfer) {
1112 LocalFrame* target_frame; 1114 LocalFrame* target_frame;
1113 if (TargetIsFrame(drag_target_.Get(), target_frame)) { 1115 if (TargetIsFrame(drag_target_.Get(), target_frame)) {
1114 if (target_frame) 1116 if (target_frame)
1115 target_frame->GetEventHandler().CancelDragAndDrop(event, data_transfer); 1117 target_frame->GetEventHandler().CancelDragAndDrop(event, data_transfer);
1116 } else if (drag_target_.Get()) { 1118 } else if (drag_target_.Get()) {
1117 if (mouse_event_manager_->GetDragState().drag_src_) 1119 if (mouse_event_manager_->GetDragState().drag_src_)
1118 mouse_event_manager_->DispatchDragSrcEvent(EventTypeNames::drag, event); 1120 mouse_event_manager_->DispatchDragSrcEvent(EventTypeNames::drag, event);
1119 mouse_event_manager_->DispatchDragEvent( 1121 mouse_event_manager_->DispatchDragEvent(EventTypeNames::dragleave,
1120 EventTypeNames::dragleave, drag_target_.Get(), event, data_transfer); 1122 drag_target_.Get(), nullptr, event,
1123 data_transfer);
1121 } 1124 }
1122 ClearDragState(); 1125 ClearDragState();
1123 } 1126 }
1124 1127
1125 WebInputEventResult EventHandler::PerformDragAndDrop( 1128 WebInputEventResult EventHandler::PerformDragAndDrop(
1126 const WebMouseEvent& event, 1129 const WebMouseEvent& event,
1127 DataTransfer* data_transfer) { 1130 DataTransfer* data_transfer) {
1128 LocalFrame* target_frame; 1131 LocalFrame* target_frame;
1129 WebInputEventResult result = WebInputEventResult::kNotHandled; 1132 WebInputEventResult result = WebInputEventResult::kNotHandled;
1130 if (TargetIsFrame(drag_target_.Get(), target_frame)) { 1133 if (TargetIsFrame(drag_target_.Get(), target_frame)) {
1131 if (target_frame) 1134 if (target_frame)
1132 result = target_frame->GetEventHandler().PerformDragAndDrop( 1135 result = target_frame->GetEventHandler().PerformDragAndDrop(
1133 event, data_transfer); 1136 event, data_transfer);
1134 } else if (drag_target_.Get()) { 1137 } else if (drag_target_.Get()) {
1135 result = mouse_event_manager_->DispatchDragEvent( 1138 result = mouse_event_manager_->DispatchDragEvent(
1136 EventTypeNames::drop, drag_target_.Get(), event, data_transfer); 1139 EventTypeNames::drop, drag_target_.Get(), nullptr, event,
1140 data_transfer);
1137 } 1141 }
1138 ClearDragState(); 1142 ClearDragState();
1139 return result; 1143 return result;
1140 } 1144 }
1141 1145
1142 void EventHandler::ClearDragState() { 1146 void EventHandler::ClearDragState() {
1143 scroll_manager_->StopAutoscroll(); 1147 scroll_manager_->StopAutoscroll();
1144 drag_target_ = nullptr; 1148 drag_target_ = nullptr;
1145 capturing_mouse_events_node_ = nullptr; 1149 capturing_mouse_events_node_ = nullptr;
1146 should_only_fire_drag_over_event_ = false; 1150 should_only_fire_drag_over_event_ = false;
(...skipping 962 matching lines...) Expand 10 before | Expand all | Expand 10 after
2109 MouseEventWithHitTestResults& mev, 2113 MouseEventWithHitTestResults& mev,
2110 LocalFrame* subframe) { 2114 LocalFrame* subframe) {
2111 WebInputEventResult result = 2115 WebInputEventResult result =
2112 subframe->GetEventHandler().HandleMouseReleaseEvent(mev.Event()); 2116 subframe->GetEventHandler().HandleMouseReleaseEvent(mev.Event());
2113 if (result != WebInputEventResult::kNotHandled) 2117 if (result != WebInputEventResult::kNotHandled)
2114 return result; 2118 return result;
2115 return WebInputEventResult::kHandledSystem; 2119 return WebInputEventResult::kHandledSystem;
2116 } 2120 }
2117 2121
2118 } // namespace blink 2122 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698