[Attachment Support] Create attachment elements when dropping files on iOS
[WebKit-https.git] / Source / WebCore / page / mac / DragControllerMac.mm
1 /*
2  * Copyright (C) 2007 Apple Inc.  All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
24  */
25
26 #import "config.h"
27 #import "DragController.h"
28
29 #if ENABLE(DRAG_SUPPORT)
30
31 #import "DataTransfer.h"
32 #import "Document.h"
33 #import "DocumentFragment.h"
34 #import "DragClient.h"
35 #import "DragData.h"
36 #import "Editor.h"
37 #import "EditorClient.h"
38 #import "Element.h"
39 #import "File.h"
40 #import "FrameView.h"
41 #import "HTMLAttachmentElement.h"
42 #import "MainFrame.h"
43 #import "Page.h"
44 #import "Pasteboard.h"
45 #import "PasteboardStrategy.h"
46 #import "PlatformStrategies.h"
47 #import "Range.h"
48 #import "RuntimeEnabledFeatures.h"
49
50 #if ENABLE(DATA_INTERACTION)
51 #import <MobileCoreServices/MobileCoreServices.h>
52 #endif
53
54 namespace WebCore {
55
56 const int DragController::MaxOriginalImageArea = 1500 * 1500;
57 const int DragController::DragIconRightInset = 7;
58 const int DragController::DragIconBottomInset = 3;
59
60 const float DragController::DragImageAlpha = 0.75f;
61
62 bool DragController::isCopyKeyDown(const DragData& dragData)
63 {
64     return dragData.flags() & DragApplicationIsCopyKeyDown;
65 }
66     
67 DragOperation DragController::dragOperation(const DragData& dragData)
68 {
69     if (dragData.flags() & DragApplicationIsModal)
70         return DragOperationNone;
71
72     bool mayContainURL;
73     if (canLoadDataFromDraggingPasteboard())
74         mayContainURL = dragData.containsURL();
75     else
76         mayContainURL = dragData.containsURLTypeIdentifier();
77
78     if (!mayContainURL && !dragData.containsPromise())
79         return DragOperationNone;
80
81     if (!m_documentUnderMouse || (!(dragData.flags() & (DragApplicationHasAttachedSheet | DragApplicationIsSource))))
82         return DragOperationCopy;
83
84     return DragOperationNone;
85 }
86
87 const IntSize& DragController::maxDragImageSize()
88 {
89     static const IntSize maxDragImageSize(400, 400);
90     
91     return maxDragImageSize;
92 }
93
94 void DragController::cleanupAfterSystemDrag()
95 {
96 #if PLATFORM(MAC)
97     // Drag has ended, dragEnded *should* have been called, however it is possible
98     // for the UIDelegate to take over the drag, and fail to send the appropriate
99     // drag termination event.  As dragEnded just resets drag variables, we just
100     // call it anyway to be on the safe side.
101     // We don't want to do this for WebKit2, since the client call to start the drag
102     // is asynchronous.
103     if (m_page.mainFrame().view()->platformWidget())
104         dragEnded();
105 #endif
106 }
107
108 #if ENABLE(DATA_INTERACTION)
109
110 DragOperation DragController::platformGenericDragOperation()
111 {
112     // On iOS, UIKit skips the -performDrop invocation altogether if MOVE is forbidden.
113     // Thus, if MOVE is not allowed in the drag source operation mask, fall back to only other allowable action, COPY.
114     return DragOperationCopy;
115 }
116
117 void DragController::updateSupportedTypeIdentifiersForDragHandlingMethod(DragHandlingMethod dragHandlingMethod, const DragData& dragData) const
118 {
119     Vector<String> supportedTypes;
120     switch (dragHandlingMethod) {
121     case DragHandlingMethod::PageLoad:
122         supportedTypes.append(kUTTypeURL);
123         break;
124     case DragHandlingMethod::EditPlainText:
125         supportedTypes.append(kUTTypeURL);
126         supportedTypes.append(kUTTypePlainText);
127         break;
128     case DragHandlingMethod::EditRichText:
129         if (RuntimeEnabledFeatures::sharedFeatures().attachmentElementEnabled()) {
130             supportedTypes.append(WebArchivePboardType);
131             supportedTypes.append(kUTTypeContent);
132             supportedTypes.append(kUTTypeItem);
133         } else {
134             for (NSString *type in Pasteboard::supportedWebContentPasteboardTypes())
135                 supportedTypes.append(type);
136         }
137         break;
138     default:
139         for (NSString *type in Pasteboard::supportedFileUploadPasteboardTypes())
140             supportedTypes.append(type);
141         break;
142     }
143     platformStrategies()->pasteboardStrategy()->updateSupportedTypeIdentifiers(supportedTypes, dragData.pasteboardName());
144 }
145
146 #endif
147
148 void DragController::declareAndWriteDragImage(DataTransfer& dataTransfer, Element& element, const URL& url, const String& label)
149 {
150     m_client.declareAndWriteDragImage(dataTransfer.pasteboard().name(), element, url, label, element.document().frame());
151 }
152
153 } // namespace WebCore
154
155 #endif // ENABLE(DRAG_SUPPORT)