| OLD | NEW |
| 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 988 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 999 | 999 |
| 1000 // Cross-process drag and drop is not yet supported. | 1000 // Cross-process drag and drop is not yet supported. |
| 1001 if (toHTMLFrameElementBase(target)->contentFrame() && | 1001 if (toHTMLFrameElementBase(target)->contentFrame() && |
| 1002 !toHTMLFrameElementBase(target)->contentFrame()->isLocalFrame()) | 1002 !toHTMLFrameElementBase(target)->contentFrame()->isLocalFrame()) |
| 1003 return false; | 1003 return false; |
| 1004 | 1004 |
| 1005 frame = toLocalFrame(toHTMLFrameElementBase(target)->contentFrame()); | 1005 frame = toLocalFrame(toHTMLFrameElementBase(target)->contentFrame()); |
| 1006 return true; | 1006 return true; |
| 1007 } | 1007 } |
| 1008 | 1008 |
| 1009 static bool findDropZone(Node* target, DataTransfer* dataTransfer) { | |
| 1010 Element* element = | |
| 1011 target->isElementNode() ? toElement(target) : target->parentElement(); | |
| 1012 for (; element; element = element->parentElement()) { | |
| 1013 bool matched = false; | |
| 1014 AtomicString dropZoneStr = element->fastGetAttribute(webkitdropzoneAttr); | |
| 1015 | |
| 1016 if (dropZoneStr.isEmpty()) | |
| 1017 continue; | |
| 1018 | |
| 1019 UseCounter::count(element->document(), | |
| 1020 UseCounter::PrefixedHTMLElementDropzone); | |
| 1021 | |
| 1022 dropZoneStr = dropZoneStr.lower(); | |
| 1023 | |
| 1024 SpaceSplitString keywords(dropZoneStr, SpaceSplitString::ShouldNotFoldCase); | |
| 1025 if (keywords.isNull()) | |
| 1026 continue; | |
| 1027 | |
| 1028 DragOperation dragOperation = DragOperationNone; | |
| 1029 for (unsigned i = 0; i < keywords.size(); i++) { | |
| 1030 DragOperation op = convertDropZoneOperationToDragOperation(keywords[i]); | |
| 1031 if (op != DragOperationNone) { | |
| 1032 if (dragOperation == DragOperationNone) | |
| 1033 dragOperation = op; | |
| 1034 } else { | |
| 1035 matched = | |
| 1036 matched || dataTransfer->hasDropZoneType(keywords[i].getString()); | |
| 1037 } | |
| 1038 | |
| 1039 if (matched && dragOperation != DragOperationNone) | |
| 1040 break; | |
| 1041 } | |
| 1042 if (matched) { | |
| 1043 dataTransfer->setDropEffect( | |
| 1044 convertDragOperationToDropZoneOperation(dragOperation)); | |
| 1045 return true; | |
| 1046 } | |
| 1047 } | |
| 1048 return false; | |
| 1049 } | |
| 1050 | |
| 1051 WebInputEventResult EventHandler::updateDragAndDrop( | 1009 WebInputEventResult EventHandler::updateDragAndDrop( |
| 1052 const WebMouseEvent& event, | 1010 const WebMouseEvent& event, |
| 1053 DataTransfer* dataTransfer) { | 1011 DataTransfer* dataTransfer) { |
| 1054 WebInputEventResult eventResult = WebInputEventResult::NotHandled; | 1012 WebInputEventResult eventResult = WebInputEventResult::NotHandled; |
| 1055 | 1013 |
| 1056 if (!m_frame->view()) | 1014 if (!m_frame->view()) |
| 1057 return eventResult; | 1015 return eventResult; |
| 1058 | 1016 |
| 1059 HitTestRequest request(HitTestRequest::ReadOnly); | 1017 HitTestRequest request(HitTestRequest::ReadOnly); |
| 1060 MouseEventWithHitTestResults mev = | 1018 MouseEventWithHitTestResults mev = |
| (...skipping 27 matching lines...) Expand all Loading... |
| 1088 } else if (newTarget) { | 1046 } else if (newTarget) { |
| 1089 // As per section 7.9.4 of the HTML 5 spec., we must always fire a drag | 1047 // As per section 7.9.4 of the HTML 5 spec., we must always fire a drag |
| 1090 // event before firing a dragenter, dragleave, or dragover event. | 1048 // event before firing a dragenter, dragleave, or dragover event. |
| 1091 if (m_mouseEventManager->dragState().m_dragSrc) { | 1049 if (m_mouseEventManager->dragState().m_dragSrc) { |
| 1092 // For now we don't care if event handler cancels default behavior, | 1050 // For now we don't care if event handler cancels default behavior, |
| 1093 // since there is none. | 1051 // since there is none. |
| 1094 m_mouseEventManager->dispatchDragSrcEvent(EventTypeNames::drag, event); | 1052 m_mouseEventManager->dispatchDragSrcEvent(EventTypeNames::drag, event); |
| 1095 } | 1053 } |
| 1096 eventResult = m_mouseEventManager->dispatchDragEvent( | 1054 eventResult = m_mouseEventManager->dispatchDragEvent( |
| 1097 EventTypeNames::dragenter, newTarget, event, dataTransfer); | 1055 EventTypeNames::dragenter, newTarget, event, dataTransfer); |
| 1098 if (eventResult == WebInputEventResult::NotHandled && | |
| 1099 findDropZone(newTarget, dataTransfer)) | |
| 1100 eventResult = WebInputEventResult::HandledSystem; | |
| 1101 } | 1056 } |
| 1102 | 1057 |
| 1103 if (targetIsFrame(m_dragTarget.get(), targetFrame)) { | 1058 if (targetIsFrame(m_dragTarget.get(), targetFrame)) { |
| 1104 if (targetFrame) | 1059 if (targetFrame) |
| 1105 eventResult = | 1060 eventResult = |
| 1106 targetFrame->eventHandler().updateDragAndDrop(event, dataTransfer); | 1061 targetFrame->eventHandler().updateDragAndDrop(event, dataTransfer); |
| 1107 } else if (m_dragTarget) { | 1062 } else if (m_dragTarget) { |
| 1108 m_mouseEventManager->dispatchDragEvent( | 1063 m_mouseEventManager->dispatchDragEvent( |
| 1109 EventTypeNames::dragleave, m_dragTarget.get(), event, dataTransfer); | 1064 EventTypeNames::dragleave, m_dragTarget.get(), event, dataTransfer); |
| 1110 } | 1065 } |
| (...skipping 15 matching lines...) Expand all Loading... |
| 1126 // Note, when dealing with sub-frames, we may need to fire only a dragover | 1081 // Note, when dealing with sub-frames, we may need to fire only a dragover |
| 1127 // event as a drag event may have been fired earlier. | 1082 // event as a drag event may have been fired earlier. |
| 1128 if (!m_shouldOnlyFireDragOverEvent && | 1083 if (!m_shouldOnlyFireDragOverEvent && |
| 1129 m_mouseEventManager->dragState().m_dragSrc) { | 1084 m_mouseEventManager->dragState().m_dragSrc) { |
| 1130 // For now we don't care if event handler cancels default behavior, | 1085 // For now we don't care if event handler cancels default behavior, |
| 1131 // since there is none. | 1086 // since there is none. |
| 1132 m_mouseEventManager->dispatchDragSrcEvent(EventTypeNames::drag, event); | 1087 m_mouseEventManager->dispatchDragSrcEvent(EventTypeNames::drag, event); |
| 1133 } | 1088 } |
| 1134 eventResult = m_mouseEventManager->dispatchDragEvent( | 1089 eventResult = m_mouseEventManager->dispatchDragEvent( |
| 1135 EventTypeNames::dragover, newTarget, event, dataTransfer); | 1090 EventTypeNames::dragover, newTarget, event, dataTransfer); |
| 1136 if (eventResult == WebInputEventResult::NotHandled && | |
| 1137 findDropZone(newTarget, dataTransfer)) | |
| 1138 eventResult = WebInputEventResult::HandledSystem; | |
| 1139 m_shouldOnlyFireDragOverEvent = false; | 1091 m_shouldOnlyFireDragOverEvent = false; |
| 1140 } | 1092 } |
| 1141 } | 1093 } |
| 1142 m_dragTarget = newTarget; | 1094 m_dragTarget = newTarget; |
| 1143 | 1095 |
| 1144 return eventResult; | 1096 return eventResult; |
| 1145 } | 1097 } |
| 1146 | 1098 |
| 1147 void EventHandler::cancelDragAndDrop(const WebMouseEvent& event, | 1099 void EventHandler::cancelDragAndDrop(const WebMouseEvent& event, |
| 1148 DataTransfer* dataTransfer) { | 1100 DataTransfer* dataTransfer) { |
| (...skipping 993 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2142 } | 2094 } |
| 2143 | 2095 |
| 2144 FrameHost* EventHandler::frameHost() const { | 2096 FrameHost* EventHandler::frameHost() const { |
| 2145 if (!m_frame->page()) | 2097 if (!m_frame->page()) |
| 2146 return nullptr; | 2098 return nullptr; |
| 2147 | 2099 |
| 2148 return &m_frame->page()->frameHost(); | 2100 return &m_frame->page()->frameHost(); |
| 2149 } | 2101 } |
| 2150 | 2102 |
| 2151 } // namespace blink | 2103 } // namespace blink |
| OLD | NEW |