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 COMPUTER, 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 COMPUTER, 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 #import "WebArchive.h" 29 #import "WebDOMOperations.h" 30 #import "WebFrame.h" 31 #import "WebFrameInternal.h" 32 #import "WebHTMLViewInternal.h" 33 #import "WebHTMLViewPrivate.h" 34 #import "WebKitLogging.h" 35 #import "WebNSPasteboardExtras.h" 36 #import "WebNSURLExtras.h" 37 #import "WebUIDelegate.h" 38 #import "WebUIDelegatePrivate.h" 39 #import "WebViewInternal.h" 40 #import <WebCore/ClipboardMac.h> 41 #import <WebCore/DragData.h> 42 #import <WebCore/EventHandler.h> 43 #import <WebCore/Frame.h> 44 #import <WebCore/FrameView.h> 45 #import <WebCore/Image.h> 46 #import <WebCore/Page.h> 47 48 using namespace WebCore; 49 50 WebDragClient::WebDragClient(WebView* webView) 51 : m_webView(webView) 52 { 53 } 54 55 static WebHTMLView *getTopHTMLView(Frame* frame) 56 { 57 ASSERT(frame); 58 ASSERT(frame->page()); 59 return (WebHTMLView*)[[kit(frame->page()->mainFrame()) frameView] documentView]; 60 } 61 62 WebCore::DragDestinationAction WebDragClient::actionMaskForDrag(WebCore::DragData* dragData) 63 { 64 return (WebCore::DragDestinationAction)[[m_webView _UIDelegateForwarder] webView:m_webView dragDestinationActionMaskForDraggingInfo:dragData->platformData()]; 65 } 66 67 void WebDragClient::willPerformDragDestinationAction(WebCore::DragDestinationAction action, WebCore::DragData* dragData) 68 { 69 [[m_webView _UIDelegateForwarder] webView:m_webView willPerformDragDestinationAction:(WebDragDestinationAction)action forDraggingInfo:dragData->platformData()]; 70 } 71 72 73 WebCore::DragSourceAction WebDragClient::dragSourceActionMaskForPoint(const IntPoint& windowPoint) 74 { 75 NSPoint viewPoint = [m_webView convertPoint:windowPoint fromView:nil]; 76 return (DragSourceAction)[[m_webView _UIDelegateForwarder] webView:m_webView dragSourceActionMaskForPoint:viewPoint]; 77 } 78 79 void WebDragClient::willPerformDragSourceAction(WebCore::DragSourceAction action, const WebCore::IntPoint& mouseDownPoint, WebCore::Clipboard* clipboard) 80 { 81 ASSERT(clipboard); 82 [[m_webView _UIDelegateForwarder] webView:m_webView willPerformDragSourceAction:(WebDragSourceAction)action fromPoint:mouseDownPoint withPasteboard:static_cast<WebCore::ClipboardMac*>(clipboard)->pasteboard()]; 83 } 84 85 void WebDragClient::startDrag(DragImageRef dragImage, const IntPoint& at, const IntPoint& eventPos, Clipboard* clipboard, Frame* frame, bool linkDrag) 86 { 87 if (!frame) 88 return; 89 ASSERT(clipboard); 90 RetainPtr<WebHTMLView> htmlView = (WebHTMLView*)[[kit(frame) frameView] documentView]; 91 if (![htmlView.get() isKindOfClass:[WebHTMLView class]]) 92 return; 93 94 NSEvent *event = linkDrag ? frame->eventHandler()->currentNSEvent() : [htmlView.get() _mouseDownEvent]; 95 WebHTMLView* topHTMLView = getTopHTMLView(frame); 96 RetainPtr<WebHTMLView> topViewProtector = topHTMLView; 97 98 [topHTMLView _stopAutoscrollTimer]; 99 NSPasteboard *pasteboard = static_cast<ClipboardMac*>(clipboard)->pasteboard(); 100 101 NSImage *dragNSImage = dragImage.get(); 102 WebHTMLView *sourceHTMLView = htmlView.get(); 103 104 id delegate = [m_webView UIDelegate]; 105 SEL selector = @selector(webView:dragImage:at:offset:event:pasteboard:source:slideBack:forView:); 106 if ([delegate respondsToSelector:selector]) { 107 if ([m_webView _catchesDelegateExceptions]) { 108 @try { 109 [delegate webView:m_webView dragImage:dragNSImage at:at offset:NSZeroSize event:event pasteboard:pasteboard source:sourceHTMLView slideBack:YES forView:topHTMLView]; 110 } @catch (id exception) { 111 ReportDiscardedDelegateException(selector, exception); 112 } 113 } else 114 [delegate webView:m_webView dragImage:dragNSImage at:at offset:NSZeroSize event:event pasteboard:pasteboard source:sourceHTMLView slideBack:YES forView:topHTMLView]; 115 } else 116 [topHTMLView dragImage:dragNSImage at:at offset:NSZeroSize event:event pasteboard:pasteboard source:sourceHTMLView slideBack:YES]; 117 } 118 119 DragImageRef WebDragClient::createDragImageForLink(KURL& url, const String& title, Frame* frame) 120 { 121 if (!frame) 122 return nil; 123 WebHTMLView *htmlView = (WebHTMLView *)[[kit(frame) frameView] documentView]; 124 NSString *label = 0; 125 if (!title.isEmpty()) 126 label = title; 127 NSURL *cocoaURL = url; 128 return [htmlView _dragImageForURL:[cocoaURL _web_userVisibleString] withLabel:label]; 129 } 130 131 132 void WebDragClient::declareAndWriteDragImage(NSPasteboard* pasteboard, DOMElement* element, NSURL* URL, NSString* title, WebCore::Frame* frame) 133 { 134 ASSERT(pasteboard); 135 ASSERT(element); 136 WebHTMLView *source = getTopHTMLView(frame); 137 WebArchive *archive = [element webArchive]; 138 139 [pasteboard _web_declareAndWriteDragImageForElement:element URL:URL title:title archive:archive source:source]; 140 } 141 142 void WebDragClient::dragControllerDestroyed() 143 { 144 delete this; 145 } 146