[iOS] Rename some WebKit-internal functions and variables that reference "data intera...
[WebKit-https.git] / Source / WebKitLegacy / mac / WebCoreSupport / WebDragClient.mm
1 /*
2  * Copyright (C) 2007, 2008 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 "WebDragClient.h"
27
28 #if ENABLE(DRAG_SUPPORT)
29
30 #import "DOMElementInternal.h"
31 #import "WebArchive.h"
32 #import "WebDOMOperations.h"
33 #import "WebFrame.h"
34 #import "WebFrameInternal.h"
35 #import "WebFrameView.h"
36 #import "WebHTMLViewInternal.h"
37 #import "WebKitLogging.h"
38 #import "WebKitNSStringExtras.h"
39 #import "WebNSURLExtras.h"
40 #import "WebUIDelegate.h"
41 #import "WebUIDelegatePrivate.h"
42 #import "WebViewInternal.h"
43
44 #if PLATFORM(MAC)
45 #import "WebNSPasteboardExtras.h"
46 #endif
47
48 #import <WebCore/DataTransfer.h>
49 #import <WebCore/DragData.h>
50 #import <WebCore/Editor.h>
51 #import <WebCore/EditorClient.h>
52 #import <WebCore/EventHandler.h>
53 #import <WebCore/FloatPoint.h>
54 #import <WebCore/Frame.h>
55 #import <WebCore/FrameView.h>
56 #import <WebCore/Image.h>
57 #import <WebCore/Page.h>
58 #import <WebCore/Pasteboard.h>
59 #import <WebCore/PasteboardWriter.h>
60
61 using namespace WebCore;
62
63 WebDragClient::WebDragClient(WebView* webView)
64     : m_webView(webView) 
65 {
66     UNUSED_PARAM(m_webView);
67 }
68
69 #if PLATFORM(MAC)
70
71 bool WebDragClient::useLegacyDragClient()
72 {
73     return false;
74 }
75
76 void WebDragClient::didConcludeEditDrag()
77 {
78 }
79
80 static WebHTMLView *getTopHTMLView(Frame* frame)
81 {
82     ASSERT(frame);
83     ASSERT(frame->page());
84     return (WebHTMLView*)[[kit(&frame->page()->mainFrame()) frameView] documentView];
85 }
86
87 void WebDragClient::willPerformDragDestinationAction(WebCore::DragDestinationAction action, const WebCore::DragData& dragData)
88 {
89     [[m_webView _UIDelegateForwarder] webView:m_webView willPerformDragDestinationAction:(WebDragDestinationAction)action forDraggingInfo:dragData.platformData()];
90 }
91
92
93 WebCore::DragSourceAction WebDragClient::dragSourceActionMaskForPoint(const IntPoint& rootViewPoint)
94 {
95     NSPoint viewPoint = [m_webView _convertPointFromRootView:rootViewPoint];
96     return (DragSourceAction)[[m_webView _UIDelegateForwarder] webView:m_webView dragSourceActionMaskForPoint:viewPoint];
97 }
98
99 void WebDragClient::willPerformDragSourceAction(WebCore::DragSourceAction action, const WebCore::IntPoint& mouseDownPoint, WebCore::DataTransfer& dataTransfer)
100 {
101     [[m_webView _UIDelegateForwarder] webView:m_webView willPerformDragSourceAction:(WebDragSourceAction)action fromPoint:mouseDownPoint withPasteboard:[NSPasteboard pasteboardWithName:dataTransfer.pasteboard().name()]];
102 }
103
104 void WebDragClient::startDrag(DragItem dragItem, DataTransfer& dataTransfer, Frame& frame)
105 {
106     auto& dragImage = dragItem.image;
107     auto dragLocationInContentCoordinates = dragItem.dragLocationInContentCoordinates;
108
109     RetainPtr<WebHTMLView> htmlView = (WebHTMLView*)[[kit(&frame) frameView] documentView];
110     if (![htmlView.get() isKindOfClass:[WebHTMLView class]])
111         return;
112     
113     NSEvent *event = dragItem.sourceAction == DragSourceActionLink ? frame.eventHandler().currentNSEvent() : [htmlView.get() _mouseDownEvent];
114     WebHTMLView* topHTMLView = getTopHTMLView(&frame);
115     RetainPtr<WebHTMLView> topViewProtector = topHTMLView;
116     
117     [topHTMLView _stopAutoscrollTimer];
118     NSPasteboard *pasteboard = [NSPasteboard pasteboardWithName:dataTransfer.pasteboard().name()];
119
120     NSImage *dragNSImage = dragImage.get().get();
121     WebHTMLView *sourceHTMLView = htmlView.get();
122
123     IntSize size([dragNSImage size]);
124     size.scale(1 / frame.page()->deviceScaleFactor());
125     [dragNSImage setSize:size];
126
127     id delegate = [m_webView UIDelegate];
128     SEL selector = @selector(webView:dragImage:at:offset:event:pasteboard:source:slideBack:forView:);
129     if ([delegate respondsToSelector:selector]) {
130         @try {
131             [delegate webView:m_webView dragImage:dragNSImage at:dragLocationInContentCoordinates offset:NSZeroSize event:event pasteboard:pasteboard source:sourceHTMLView slideBack:YES forView:topHTMLView];
132         } @catch (id exception) {
133             ReportDiscardedDelegateException(selector, exception);
134         }
135     } else
136         ALLOW_DEPRECATED_DECLARATIONS_BEGIN
137         [topHTMLView dragImage:dragNSImage at:dragLocationInContentCoordinates offset:NSZeroSize event:event pasteboard:pasteboard source:sourceHTMLView slideBack:YES];
138         ALLOW_DEPRECATED_DECLARATIONS_END
139 }
140
141 void WebDragClient::beginDrag(DragItem dragItem, Frame& frame, const IntPoint& mouseDownPosition, const IntPoint& mouseDraggedPosition, DataTransfer& dataTransfer, DragSourceAction dragSourceAction)
142 {
143     ASSERT(!dataTransfer.pasteboard().hasData());
144
145     RetainPtr<WebHTMLView> topWebHTMLView = dynamic_objc_cast<WebHTMLView>(m_webView.mainFrame.frameView.documentView);
146     ASSERT(topWebHTMLView);
147
148     [topWebHTMLView _stopAutoscrollTimer];
149
150     auto draggingItem = adoptNS([[NSDraggingItem alloc] initWithPasteboardWriter:createPasteboardWriter(dragItem.data).get()]);
151
152     auto dragImageSize = IntSize { [dragItem.image.get() size] };
153
154     dragImageSize.scale(1 / frame.page()->deviceScaleFactor());
155     [dragItem.image.get() setSize:dragImageSize];
156
157     NSRect draggingFrame = NSMakeRect(mouseDraggedPosition.x() - dragImageSize.width() * dragItem.imageAnchorPoint.x(), mouseDraggedPosition.y() - dragImageSize.height() * dragItem.imageAnchorPoint.y(), dragImageSize.width(), dragImageSize.height());
158     [draggingItem setDraggingFrame:draggingFrame contents:dragItem.image.get().get()];
159
160     // FIXME: We should be able to make a fake event with the mosue dragged coordinates.
161     NSEvent *event = frame.eventHandler().currentNSEvent();
162     [topWebHTMLView.get() beginDraggingSessionWithItems:@[ draggingItem.get() ] event:event source:topWebHTMLView.get()];
163 }
164
165 void WebDragClient::declareAndWriteDragImage(const String& pasteboardName, Element& element, const URL& url, const String& title, WebCore::Frame* frame)
166 {
167     ASSERT(pasteboardName);
168     [[NSPasteboard pasteboardWithName:pasteboardName] _web_declareAndWriteDragImageForElement:kit(&element) URL:url title:title archive:[kit(&element) webArchive] source:getTopHTMLView(frame)];
169 }
170
171 #elif !ENABLE(DATA_INTERACTION)
172
173 bool WebDragClient::useLegacyDragClient()
174 {
175     return false;
176 }
177
178 void WebDragClient::didConcludeEditDrag()
179 {
180 }
181
182 void WebDragClient::willPerformDragDestinationAction(WebCore::DragDestinationAction, const WebCore::DragData&)
183 {
184 }
185
186 WebCore::DragSourceAction WebDragClient::dragSourceActionMaskForPoint(const IntPoint&)
187 {
188     return DragSourceActionNone;
189 }
190
191 void WebDragClient::willPerformDragSourceAction(WebCore::DragSourceAction, const WebCore::IntPoint&, WebCore::DataTransfer&)
192 {
193 }
194
195 void WebDragClient::startDrag(WebCore::DragItem, DataTransfer&, Frame&)
196 {
197 }
198
199 void WebDragClient::beginDrag(DragItem, Frame&, const IntPoint&, const IntPoint&, DataTransfer&, DragSourceAction)
200 {
201 }
202
203 void WebDragClient::declareAndWriteDragImage(const String&, Element&, const URL&, const String&, WebCore::Frame*)
204 {
205 }
206
207 #endif
208
209 #if PLATFORM(IOS_FAMILY)
210
211 bool WebDragClient::useLegacyDragClient()
212 {
213     // FIXME: Move the iOS drag and drop implementation for WebKit1 off of the legacy drag client.
214     return true;
215 }
216
217 void WebDragClient::willPerformDragDestinationAction(DragDestinationAction, const DragData&)
218 {
219 }
220
221 WebCore::DragSourceAction WebDragClient::dragSourceActionMaskForPoint(const IntPoint&)
222 {
223     return DragSourceActionAny;
224 }
225
226 void WebDragClient::willPerformDragSourceAction(WebCore::DragSourceAction, const IntPoint&, DataTransfer&)
227 {
228 }
229
230 void WebDragClient::startDrag(DragItem dragItem, DataTransfer&, Frame&)
231 {
232     [m_webView _startDrag:dragItem];
233 }
234
235 void WebDragClient::beginDrag(DragItem, Frame&, const IntPoint&, const IntPoint&, DataTransfer&, DragSourceAction)
236 {
237 }
238
239 void WebDragClient::declareAndWriteDragImage(const String& pasteboardName, Element& element, const URL& url, const String& label, Frame*)
240 {
241     if (auto* frame = element.document().frame())
242         frame->editor().writeImageToPasteboard(*Pasteboard::createForDragAndDrop(), element, url, label);
243 }
244
245 void WebDragClient::didConcludeEditDrag()
246 {
247     [m_webView _didConcludeEditDrag];
248 }
249
250 #endif // PLATFORM(IOS_FAMILY)
251
252 void WebDragClient::dragControllerDestroyed() 
253 {
254     delete this;
255 }
256
257 #endif // ENABLE(DRAG_SUPPORT)