Home | History | Annotate | Download | only in WebCoreSupport
      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