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 |