[SCM] WebKit Debian packaging branch, debian/unstable, updated. debian/1.1.15-1-40151-g37bb677

cblu cblu at 268f45cc-cd09-0410-ab3c-d52691b4dbfc
Sat Sep 26 08:40:48 UTC 2009


The following commit has been merged in the debian/unstable branch:
commit 3084577852ff8fe244760ec03175b66057bd2f50
Author: cblu <cblu at 268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date:   Thu May 20 00:48:15 2004 +0000

    WebCore:
    
    	Tweaks for forthcoming dragging improvements.
    
            Reviewed by john.
    
            * kwq/WebCoreBridge.h:
            * kwq/WebCoreBridge.mm:
            (-[WebCoreBridge moveDragCaretToPoint:]): renamed for future reasons, removed text only restrictions
    
    WebKit:
    
    	Fixed: <rdar://problem/3462627>: (API: Need a way to disable/customize dragging)
    
            Reviewed by john.
    
            * Misc.subproj/WebNSPasteboardExtras.m:
            (-[NSPasteboard _web_writeImage:URL:title:archive:types:]): fixed bug that caused exception
            * WebView.subproj/WebDefaultUIDelegate.m:
            (-[WebDefaultUIDelegate webView:shouldBeginDragForElement:dragImage:mouseDownEvent:mouseDraggedEvent:]): new, returns YES
            (-[WebDefaultUIDelegate webView:dragOperationForDraggingInfo:overElement:]): new, returns [WebView dragOperationForDraggingInfo:]
            (-[WebDefaultUIDelegate webView:shouldProcessDragWithDraggingInfo:overElement:]): new, returns YES
            * WebView.subproj/WebDocumentInternal.h: added WebDocumentDragging and WebDocumentElement for document dragging
            * WebView.subproj/WebDocumentPrivate.h: moved WebDocumentSelection to WebDocumentInternal.h
            * WebView.subproj/WebFrame.m:
            (-[WebFrame _actionInformationForNavigationType:event:originalURL:]):
            * WebView.subproj/WebHTMLView.h:
            * WebView.subproj/WebHTMLView.m:
            (+[WebHTMLView _insertablePasteboardTypes]): new
            (-[WebHTMLView _handleMouseDragged:]): call shouldBeginDragForElement:::: delegate API
            (-[WebHTMLView _mayStartDragWithMouseDragged:]): call renamed elementAtPoint SPI
            (-[WebHTMLView initWithFrame:]): don't register for drag types since this is handled at the WebView
            (-[WebHTMLView menuForEvent:]): call renamed elementAtPoint SPI
            (-[WebHTMLView _isSelectionEvent:]): call renamed elementAtPoint SPI
            (-[WebHTMLView dragImage:at:offset:event:pasteboard:source:slideBack:]): rather than unregistering drag types on the WebView, just tell it that we're dragging
            (-[WebHTMLView draggedImage:endedAt:operation:]): ditto
            (-[WebHTMLView _canProcessDragWithDraggingInfo:]): new
            (-[WebHTMLView dragOperationForDraggingInfo:]): new WebDocumentDragging SPI
            (-[WebHTMLView draggingUpdatedWithDraggingInfo:]): ditto
            (-[WebHTMLView concludeDragForDraggingInfo:]): ditto
            (-[WebHTMLView elementAtPoint:]): renamed from _elementAtPoint since this is part of the WebDocumentElement SPI
            * WebView.subproj/WebHTMLViewPrivate.h:
            * WebView.subproj/WebImageView.h:
            * WebView.subproj/WebImageView.m:
            (-[WebImageView elementAtPoint:]): new
            (-[WebImageView menuForEvent:]): call elementAtPoint
            (-[WebImageView mouseDragged:]): rather than unregistering drag types on the WebView, just tell it that we're dragging
            (-[WebImageView draggedImage:endedAt:operation:]): ditto
            * WebView.subproj/WebTextView.h:
            * WebView.subproj/WebTextView.m:
            (-[WebTextView _elementAtWindowPoint:]): new
            (-[WebTextView elementAtPoint:]): new
            (-[WebTextView menuForEvent:]): call _elementAtWindowPoint
            * WebView.subproj/WebView.h:
            * WebView.subproj/WebView.m:
            (-[WebViewPrivate dealloc]): removed draggedTypes ivar
            (+[WebView URLFromPasteboard:]): implemented
            (+[WebView URLTitleFromPasteboard:]): implemented
            (-[WebView _registerDraggedTypes]): moved
            (-[WebView _frameViewAtWindowPoint:]): new
            (-[WebView _draggingDocumentViewAtWindowPoint:]): new
            (-[WebView _elementAtWindowPoint:]): new
            (-[WebView dragOperationForDraggingInfo:]): updated this API to handle subviews that may want to handle drags
            (-[WebView _dragOperationForDraggingInfo:]): new, handles UI delegate for drag control
            (-[WebView draggingEntered:]): call _dragOperationForDraggingInfo:
            (-[WebView draggingUpdated:]): ditto
            (-[WebView concludeDragOperation:]): work with the UI delegate and the subview to handle what happens
            * WebView.subproj/WebViewPrivate.h:
    
    
    git-svn-id: http://svn.webkit.org/repository/webkit/trunk@6645 268f45cc-cd09-0410-ab3c-d52691b4dbfc

diff --git a/WebCore/ChangeLog-2005-08-23 b/WebCore/ChangeLog-2005-08-23
index f217dc7..0a6d8ac 100644
--- a/WebCore/ChangeLog-2005-08-23
+++ b/WebCore/ChangeLog-2005-08-23
@@ -1,3 +1,13 @@
+2004-05-19  Chris Blumenberg  <cblu at apple.com>
+
+	Tweaks for forthcoming dragging improvements.
+
+        Reviewed by john.
+
+        * kwq/WebCoreBridge.h:
+        * kwq/WebCoreBridge.mm:
+        (-[WebCoreBridge moveDragCaretToPoint:]): renamed for future reasons, removed text only restrictions
+
 2004-05-19  Ken Kocienda  <kocienda at apple.com>
 
         Reviewed by Hyatt and Darin
diff --git a/WebCore/kwq/WebCoreBridge.h b/WebCore/kwq/WebCoreBridge.h
index 2a9ad8a..a237a3c 100644
--- a/WebCore/kwq/WebCoreBridge.h
+++ b/WebCore/kwq/WebCoreBridge.h
@@ -233,7 +233,7 @@ typedef enum {
 - (void)setSelectionFrom:(DOMNode *)start startOffset:(int)startOffset to:(DOMNode *)end endOffset:(int) endOffset;
 
 - (BOOL)isSelectionEditable;
-- (BOOL)moveCaretToPoint:(NSPoint)point;
+- (void)moveDragCaretToPoint:(NSPoint)point;
 
 - (BOOL)haveSelection;
 
diff --git a/WebCore/kwq/WebCoreBridge.mm b/WebCore/kwq/WebCoreBridge.mm
index b2b4f6b..978aa1d 100644
--- a/WebCore/kwq/WebCoreBridge.mm
+++ b/WebCore/kwq/WebCoreBridge.mm
@@ -420,26 +420,19 @@ static bool initializedKJS = FALSE;
 	return startNode ? startNode->isContentEditable() : NO;
 }
 
-- (BOOL)moveCaretToPoint:(NSPoint)point
+- (void)moveDragCaretToPoint:(NSPoint)point
 {
     RenderObject *renderer = _part->renderer();
     if (!renderer) {
-        return NO;
+        return;
     }
     
     RenderObject::NodeInfo nodeInfo(true, true);
     renderer->layer()->nodeAtPoint(nodeInfo, (int)point.x, (int)point.y);
     NodeImpl *node = nodeInfo.innerNode();
-
-    // FIXME: You should be move the caret to non-text nodes.
-    if (!node->isTextNode()) {
-        return NO;
-    }
         
     Selection selection(node->positionForCoordinates((int)point.x, (int)point.y));
     _part->setSelection(selection);
-    
-    return YES;
 }
 
 - (BOOL)haveSelection
diff --git a/WebKit/ChangeLog b/WebKit/ChangeLog
index a9f49e0..852fddd 100644
--- a/WebKit/ChangeLog
+++ b/WebKit/ChangeLog
@@ -1,3 +1,62 @@
+2004-05-19  Chris Blumenberg  <cblu at apple.com>
+
+	Fixed: <rdar://problem/3462627>: (API: Need a way to disable/customize dragging)
+
+        Reviewed by john.
+
+        * Misc.subproj/WebNSPasteboardExtras.m:
+        (-[NSPasteboard _web_writeImage:URL:title:archive:types:]): fixed bug that caused exception
+        * WebView.subproj/WebDefaultUIDelegate.m:
+        (-[WebDefaultUIDelegate webView:shouldBeginDragForElement:dragImage:mouseDownEvent:mouseDraggedEvent:]): new, returns YES
+        (-[WebDefaultUIDelegate webView:dragOperationForDraggingInfo:overElement:]): new, returns [WebView dragOperationForDraggingInfo:]
+        (-[WebDefaultUIDelegate webView:shouldProcessDragWithDraggingInfo:overElement:]): new, returns YES
+        * WebView.subproj/WebDocumentInternal.h: added WebDocumentDragging and WebDocumentElement for document dragging
+        * WebView.subproj/WebDocumentPrivate.h: moved WebDocumentSelection to WebDocumentInternal.h
+        * WebView.subproj/WebFrame.m:
+        (-[WebFrame _actionInformationForNavigationType:event:originalURL:]): 
+        * WebView.subproj/WebHTMLView.h:
+        * WebView.subproj/WebHTMLView.m:
+        (+[WebHTMLView _insertablePasteboardTypes]): new 
+        (-[WebHTMLView _handleMouseDragged:]): call shouldBeginDragForElement:::: delegate API
+        (-[WebHTMLView _mayStartDragWithMouseDragged:]): call renamed elementAtPoint SPI
+        (-[WebHTMLView initWithFrame:]): don't register for drag types since this is handled at the WebView
+        (-[WebHTMLView menuForEvent:]): call renamed elementAtPoint SPI
+        (-[WebHTMLView _isSelectionEvent:]): call renamed elementAtPoint SPI
+        (-[WebHTMLView dragImage:at:offset:event:pasteboard:source:slideBack:]): rather than unregistering drag types on the WebView, just tell it that we're dragging
+        (-[WebHTMLView draggedImage:endedAt:operation:]): ditto
+        (-[WebHTMLView _canProcessDragWithDraggingInfo:]): new
+        (-[WebHTMLView dragOperationForDraggingInfo:]): new WebDocumentDragging SPI
+        (-[WebHTMLView draggingUpdatedWithDraggingInfo:]): ditto
+        (-[WebHTMLView concludeDragForDraggingInfo:]): ditto
+        (-[WebHTMLView elementAtPoint:]): renamed from _elementAtPoint since this is part of the WebDocumentElement SPI
+        * WebView.subproj/WebHTMLViewPrivate.h:
+        * WebView.subproj/WebImageView.h:
+        * WebView.subproj/WebImageView.m:
+        (-[WebImageView elementAtPoint:]): new
+        (-[WebImageView menuForEvent:]): call elementAtPoint
+        (-[WebImageView mouseDragged:]): rather than unregistering drag types on the WebView, just tell it that we're dragging
+        (-[WebImageView draggedImage:endedAt:operation:]): ditto
+        * WebView.subproj/WebTextView.h:
+        * WebView.subproj/WebTextView.m:
+        (-[WebTextView _elementAtWindowPoint:]): new
+        (-[WebTextView elementAtPoint:]): new
+        (-[WebTextView menuForEvent:]): call _elementAtWindowPoint
+        * WebView.subproj/WebView.h:
+        * WebView.subproj/WebView.m:
+        (-[WebViewPrivate dealloc]): removed draggedTypes ivar
+        (+[WebView URLFromPasteboard:]): implemented
+        (+[WebView URLTitleFromPasteboard:]): implemented
+        (-[WebView _registerDraggedTypes]): moved
+        (-[WebView _frameViewAtWindowPoint:]): new
+        (-[WebView _draggingDocumentViewAtWindowPoint:]): new
+        (-[WebView _elementAtWindowPoint:]): new
+        (-[WebView dragOperationForDraggingInfo:]): updated this API to handle subviews that may want to handle drags
+        (-[WebView _dragOperationForDraggingInfo:]): new, handles UI delegate for drag control
+        (-[WebView draggingEntered:]): call _dragOperationForDraggingInfo:
+        (-[WebView draggingUpdated:]): ditto
+        (-[WebView concludeDragOperation:]): work with the UI delegate and the subview to handle what happens
+        * WebView.subproj/WebViewPrivate.h:
+
 2004-05-19  Richard Williamson   <rjw at apple.com>
 
         Removed extraneous tabs that were added (by XCode?).
diff --git a/WebKit/Misc.subproj/WebNSPasteboardExtras.m b/WebKit/Misc.subproj/WebNSPasteboardExtras.m
index 8211c63..0bde080 100644
--- a/WebKit/Misc.subproj/WebNSPasteboardExtras.m
+++ b/WebKit/Misc.subproj/WebNSPasteboardExtras.m
@@ -189,10 +189,10 @@ NSString *WebURLNamePboardType = nil;
         if ([types containsObject:NSRTFDPboardType]) {
             // This image data is either the only subresource of an archive (HTML image case)
             // or the main resource (standalone image case).
-            WebResource *resource = [[archive subresources] objectAtIndex:0];
-            if (resource == nil) {
-                resource = [archive mainResource];
-            }
+            NSArray *subresources = [archive subresources];
+            WebResource *resource = [subresources count] > 0 ? [subresources objectAtIndex:0] : [archive mainResource];
+            ASSERT(resource != nil);
+            
             ASSERT([[[WebImageRendererFactory sharedFactory] supportedMIMETypes] containsObject:[resource MIMEType]]);
             [self _web_writeFileWrapperAsRTFDAttachment:[resource _fileWrapperRepresentation]];
         }
diff --git a/WebKit/WebView.subproj/WebDefaultUIDelegate.m b/WebKit/WebView.subproj/WebDefaultUIDelegate.m
index 34e0293..d758147 100644
--- a/WebKit/WebView.subproj/WebDefaultUIDelegate.m
+++ b/WebKit/WebView.subproj/WebDefaultUIDelegate.m
@@ -168,4 +168,19 @@ static WebDefaultUIDelegate *sharedDelegate = nil;
 {
 }
 
+- (BOOL)webView:(WebView *)webView shouldBeginDragForElement:(NSDictionary *)element dragImage:(NSImage *)dragImage mouseDownEvent:(NSEvent *)mouseDownEvent mouseDraggedEvent:(NSEvent *)mouseDraggedEvent
+{
+    return YES;
+}
+
+- (NSDragOperation)webView:(WebView *)webView dragOperationForDraggingInfo:(id <NSDraggingInfo>)draggingInfo overElement:(NSDictionary *)element
+{
+    return [webView dragOperationForDraggingInfo:draggingInfo];
+}
+
+- (BOOL)webView:(WebView *)webView shouldProcessDragWithDraggingInfo:(id <NSDraggingInfo>)draggingInfo overElement:(NSDictionary *)element
+{
+    return YES;
+}
+
 @end
diff --git a/WebKit/WebView.subproj/WebDocumentInternal.h b/WebKit/WebView.subproj/WebDocumentInternal.h
index e9e5542..055ce62 100644
--- a/WebKit/WebView.subproj/WebDocumentInternal.h
+++ b/WebKit/WebView.subproj/WebDocumentInternal.h
@@ -17,3 +17,19 @@
 */
 - (void)_web_textSizeMultiplierChanged;
 @end
+
+ at protocol WebDocumentDragging <NSObject>
+- (NSDragOperation)dragOperationForDraggingInfo:(id <NSDraggingInfo>)draggingInfo;
+- (void)draggingUpdatedWithDraggingInfo:(id <NSDraggingInfo>)draggingInfo;
+- (BOOL)concludeDragForDraggingInfo:(id <NSDraggingInfo>)draggingInfo;
+ at end
+
+ at protocol WebDocumentElement <NSObject>
+- (NSDictionary *)elementAtPoint:(NSPoint)point;
+ at end
+
+ at protocol WebDocumentSelection <NSObject>
+- (NSArray *)pasteboardTypesForSelection;
+- (void)writeSelectionWithPasteboardTypes:(NSArray *)types toPasteboard:(NSPasteboard *)pasteboard;
+ at end
+
diff --git a/WebKit/WebView.subproj/WebDocumentPrivate.h b/WebKit/WebView.subproj/WebDocumentPrivate.h
index e3c3f14..b92a391 100644
--- a/WebKit/WebView.subproj/WebDocumentPrivate.h
+++ b/WebKit/WebView.subproj/WebDocumentPrivate.h
@@ -15,8 +15,3 @@
 @protocol WebDocumentDOM <NSObject>
 - (DOMDocument *)DOMDocument;
 @end
-
- at protocol WebDocumentSelection <NSObject>
-- (NSArray *)pasteboardTypesForSelection;
-- (void)writeSelectionWithPasteboardTypes:(NSArray *)types toPasteboard:(NSPasteboard *)pasteboard;
- at end
\ No newline at end of file
diff --git a/WebKit/WebView.subproj/WebFrame.m b/WebKit/WebView.subproj/WebFrame.m
index 69c5288..0ff304a 100644
--- a/WebKit/WebView.subproj/WebFrame.m
+++ b/WebKit/WebView.subproj/WebFrame.m
@@ -1417,7 +1417,7 @@ static CFAbsoluteTime _timeOfLastCompletedLoad;
             }
             if (viewContainingPoint != nil) {
                 NSPoint point = [viewContainingPoint convertPoint:[event locationInWindow] fromView:nil];
-                NSDictionary *elementInfo = [(WebHTMLView *)viewContainingPoint _elementAtPoint:point];
+                NSDictionary *elementInfo = [(WebHTMLView *)viewContainingPoint elementAtPoint:point];
         
                 return [NSDictionary dictionaryWithObjectsAndKeys:
                     [NSNumber numberWithInt:navigationType], WebActionNavigationTypeKey,
diff --git a/WebKit/WebView.subproj/WebHTMLView.h b/WebKit/WebView.subproj/WebHTMLView.h
index cdf425e..69df166 100644
--- a/WebKit/WebView.subproj/WebHTMLView.h
+++ b/WebKit/WebView.subproj/WebHTMLView.h
@@ -3,16 +3,20 @@
 	Copyright 2002, Apple, Inc. All rights reserved.
 */
 
-#import <WebKit/WebDocumentPrivate.h>
+#import <WebKit/WebDocument.h>
 
 @class WebDataSource;
 @class WebHTMLViewPrivate;
 
+ at protocol WebDocumentDragging;
+ at protocol WebDocumentElement;
+ at protocol WebDocumentSelection;
+
 /*!
     @class WebHTMLView
     @discussion A document view of WebFrameView that displays HTML content.
 */
- at interface WebHTMLView : NSView <WebDocumentView, WebDocumentSearching, WebDocumentText, WebDocumentSelection>
+ at interface WebHTMLView : NSView <WebDocumentView, WebDocumentSearching, WebDocumentText, WebDocumentDragging, WebDocumentElement, WebDocumentSelection>
 {
 @private
     WebHTMLViewPrivate *_private;
diff --git a/WebKit/WebView.subproj/WebHTMLView.m b/WebKit/WebView.subproj/WebHTMLView.m
index 2d058d8..fdb8c62 100644
--- a/WebKit/WebView.subproj/WebHTMLView.m
+++ b/WebKit/WebView.subproj/WebHTMLView.m
@@ -209,37 +209,6 @@ static BOOL forceRealHitTest = NO;
     [self performSelector:selector withObject:nil afterDelay:0];
 }
 
-- (NSDictionary *)_elementAtPoint:(NSPoint)point
-{
-    NSDictionary *elementInfoWC = [[self _bridge] elementAtPoint:point];
-    NSMutableDictionary *elementInfo = [elementInfoWC mutableCopy];
-
-    // Convert URL strings to NSURLs
-    [elementInfo _web_setObjectIfNotNil:[NSURL _web_URLWithDataAsString:[elementInfoWC objectForKey:WebElementLinkURLKey]] forKey:WebElementLinkURLKey];
-    [elementInfo _web_setObjectIfNotNil:[NSURL _web_URLWithDataAsString:[elementInfoWC objectForKey:WebElementImageURLKey]] forKey:WebElementImageURLKey];
-    
-    WebFrameView *webFrameView = [self _web_parentWebFrameView];
-    ASSERT(webFrameView);
-    WebFrame *webFrame = [webFrameView webFrame];
-    
-    if (webFrame) {
-        NSString *frameName = [elementInfoWC objectForKey:WebElementLinkTargetFrameKey];
-        if ([frameName length] == 0) {
-            [elementInfo setObject:webFrame forKey:WebElementLinkTargetFrameKey];
-        } else {
-            WebFrame *wf = [webFrame findFrameNamed:frameName];
-            if (wf != nil)
-                [elementInfo setObject:wf forKey:WebElementLinkTargetFrameKey];
-            else
-                [elementInfo removeObjectForKey:WebElementLinkTargetFrameKey];
-        }
-    
-        [elementInfo setObject:webFrame forKey:WebElementFrameKey];
-    }
-    
-    return [elementInfo autorelease];
-}
-
 - (void)_setAsideSubviews
 {
     ASSERT(!_private->subviewsSetAside);
@@ -512,7 +481,7 @@ static WebHTMLView *lastHitView = nil;
         [[view _bridge] mouseMoved:event];
 
         NSPoint point = [view convertPoint:[event locationInWindow] fromView:nil];
-        element = [view _elementAtPoint:point];
+        element = [view elementAtPoint:point];
     }
 
     // Have the web view send a message to the delegate so it can do status bar display.
@@ -522,6 +491,17 @@ static WebHTMLView *lastHitView = nil;
     [self _setToolTip:[element objectForKey:WebCoreElementTitleKey]];
 }
 
++ (NSArray *)_insertablePasteboardTypes
+{
+    static NSArray *types = nil;
+    if (!types) {
+        types = [[NSArray alloc] initWithObjects:WebArchivePboardType, NSHTMLPboardType,
+            NSTIFFPboardType, NSPICTPboardType, NSURLPboardType, 
+            NSRTFDPboardType, NSRTFPboardType, NSStringPboardType, nil];
+    }
+    return types;
+}
+
 + (NSArray *)_selectionPasteboardTypes
 {
     return [NSArray arrayWithObjects:WebArchivePboardType, NSHTMLPboardType, NSRTFPboardType, NSRTFDPboardType, NSStringPboardType, nil];
@@ -700,10 +680,10 @@ static WebHTMLView *lastHitView = nil;
     return dragImage;
 }
 
-- (void)_handleMouseDragged:(NSEvent *)event
+- (void)_handleMouseDragged:(NSEvent *)mouseDraggedEvent
 {
     NSPoint mouseDownPoint = [self convertPoint:[_private->mouseDownEvent locationInWindow] fromView:nil];
-    NSDictionary *element = [self _elementAtPoint:mouseDownPoint];
+    NSDictionary *element = [self elementAtPoint:mouseDownPoint];
 
     NSURL *linkURL = [element objectForKey:WebElementLinkURLKey];
     NSURL *imageURL = [element objectForKey:WebElementImageURLKey];
@@ -716,7 +696,7 @@ static WebHTMLView *lastHitView = nil;
     ASSERT((imageURL && [[WebPreferences standardPreferences] loadsImagesAutomatically]) ||
            (!imageURL && linkURL) || isSelected); 
 
-    NSPoint mouseDraggedPoint = [self convertPoint:[event locationInWindow] fromView:nil];
+    NSPoint mouseDraggedPoint = [self convertPoint:[mouseDraggedEvent locationInWindow] fromView:nil];
     float deltaX = ABS(mouseDraggedPoint.x - mouseDownPoint.x);
     float deltaY = ABS(mouseDraggedPoint.y - mouseDownPoint.y);
     
@@ -727,6 +707,31 @@ static WebHTMLView *lastHitView = nil;
         return;
     }
     
+    NSImage *dragImage = nil;
+    
+    if (imageURL) {
+        dragImage = [[[element objectForKey:WebElementImageKey] copy] autorelease];
+        [dragImage _web_dissolveToFraction:WebDragImageAlpha];
+    } else if (linkURL) {
+        dragImage = [self _dragImageForLinkElement:element];
+    } else if (isSelected) {
+        dragImage = [[self _bridge] selectionImage];
+        [dragImage _web_dissolveToFraction:WebDragImageAlpha];
+    } else {
+        ASSERT_NOT_REACHED();
+    }
+    
+    ASSERT(dragImage != nil);
+    
+    WebView *webView = [self _webView];
+    if (![[webView _UIDelegateForwarder] webView:webView
+                       shouldBeginDragForElement:element 
+                                       dragImage:dragImage 
+                                  mouseDownEvent:_private->mouseDownEvent 
+                               mouseDraggedEvent:mouseDraggedEvent]) {
+        return;   
+    }
+    
     if (imageURL) {
         _private->draggingImageURL = [imageURL retain];
         WebImageRenderer *image = [element objectForKey:WebElementImageKey];
@@ -743,12 +748,11 @@ static WebHTMLView *lastHitView = nil;
         NSArray *types = [NSPasteboard _web_writableTypesForURL];
         [pasteboard declareTypes:types owner:self];
         [pasteboard _web_writeURL:linkURL andTitle:[element objectForKey:WebElementLinkLabelKey] types:types];
-        NSImage *dragImage = [self _dragImageForLinkElement:element];
         NSSize offset = NSMakeSize([dragImage size].width / 2, -DRAG_LABEL_BORDER_Y);
         [self dragImage:dragImage
                      at:NSMakePoint(mouseDraggedPoint.x - offset.width, mouseDraggedPoint.y - offset.height)
                  offset:offset
-                  event:event
+                  event:mouseDraggedEvent
              pasteboard:pasteboard
                  source:self
               slideBack:NO];
@@ -756,10 +760,8 @@ static WebHTMLView *lastHitView = nil;
     } else if (isSelected) {
         NSPasteboard *pasteboard = [NSPasteboard pasteboardWithName:NSDragPboard];
         [self _writeSelectionToPasteboard:pasteboard];
-        NSImage *selectionImage = [[self _bridge] selectionImage];
-        [selectionImage _web_dissolveToFraction:WebDragImageAlpha];
         NSRect visibleSelectionRect = [[self _bridge] visibleSelectionRect];
-        [self dragImage:selectionImage
+        [self dragImage:dragImage
                      at:NSMakePoint(NSMinX(visibleSelectionRect), NSMaxY(visibleSelectionRect))
                  offset:NSMakeSize(mouseDraggedPoint.x - mouseDownPoint.x, mouseDraggedPoint.y - mouseDownPoint.y)
                   event:_private->mouseDownEvent
@@ -767,7 +769,7 @@ static WebHTMLView *lastHitView = nil;
                  source:self
               slideBack:YES];
     } else {
-        ERROR("Attempt to drag unknown element");
+        ASSERT_NOT_REACHED();
     }
 }
 
@@ -780,7 +782,7 @@ static WebHTMLView *lastHitView = nil;
 - (BOOL)_mayStartDragWithMouseDragged:(NSEvent *)mouseDraggedEvent
 {
     NSPoint mouseDownPoint = [self convertPoint:[_private->mouseDownEvent locationInWindow] fromView:nil];
-    NSDictionary *mouseDownElement = [self _elementAtPoint:mouseDownPoint];
+    NSDictionary *mouseDownElement = [self elementAtPoint:mouseDownPoint];
 
     NSURL *imageURL = [mouseDownElement objectForKey: WebElementImageURLKey];
 
@@ -986,10 +988,6 @@ static WebHTMLView *lastHitView = nil;
     _private->pluginController = [[WebPluginController alloc] initWithHTMLView:self];
     _private->needsLayout = YES;
 
-    [self registerForDraggedTypes:[NSArray arrayWithObjects:WebArchivePboardType, NSHTMLPboardType,
-        NSTIFFPboardType, NSPICTPboardType, NSURLPboardType, 
-        NSRTFDPboardType, NSRTFPboardType, NSStringPboardType, nil]];
-
     return self;
 }
 
@@ -1392,7 +1390,7 @@ static WebHTMLView *lastHitView = nil;
         return nil;
     }
     NSPoint point = [self convertPoint:[event locationInWindow] fromView:nil];
-    NSDictionary *element = [self _elementAtPoint:point];
+    NSDictionary *element = [self elementAtPoint:point];
     return [[self _webView] _menuForElement:element];
 }
 
@@ -1595,7 +1593,7 @@ static WebHTMLView *lastHitView = nil;
 - (BOOL)_isSelectionEvent:(NSEvent *)event
 {
     NSPoint point = [self convertPoint:[event locationInWindow] fromView:nil];
-    return [[[self _elementAtPoint:point] objectForKey:WebElementIsSelectedKey] boolValue];
+    return [[[self elementAtPoint:point] objectForKey:WebElementIsSelectedKey] boolValue];
 }
 
 - (BOOL)acceptsFirstMouse:(NSEvent *)event
@@ -1638,12 +1636,10 @@ static WebHTMLView *lastHitView = nil;
            source:(id)source
         slideBack:(BOOL)slideBack
 {   
-    _private->isDragging = YES;
-    
     [self _stopAutoscrollTimer];
-
-    // Don't allow drags to be accepted by this WebFrameView.
-    [[self _webView] unregisterDraggedTypes];
+    
+    _private->initiatedDrag = YES;
+    [[self _webView] _setInitiatedDrag:YES];
     
     // Retain this view during the drag because it may be released before the drag ends.
     [self retain];
@@ -1660,12 +1656,13 @@ static WebHTMLView *lastHitView = nil;
 
 - (unsigned)draggingSourceOperationMaskForLocal:(BOOL)isLocal
 {
-    return (NSDragOperationGeneric|NSDragOperationCopy);
+    return (NSDragOperationGeneric | NSDragOperationCopy);
 }
 
 - (void)draggedImage:(NSImage *)anImage endedAt:(NSPoint)aPoint operation:(NSDragOperation)operation
 {
-    _private->isDragging = NO;
+    _private->initiatedDrag = NO;
+    [[self _webView] _setInitiatedDrag:NO];
     
     // Prevent queued mouseDragged events from coming after the drag and fake mouseUp event.
     _private->ignoringMouseDraggedEvents = YES;
@@ -1680,9 +1677,6 @@ static WebHTMLView *lastHitView = nil;
                                              context:[[NSApp currentEvent] context]
                                          eventNumber:0 clickCount:0 pressure:0];
     [self mouseUp:fakeEvent]; // This will also update the mouseover state.
-
-    // Reregister for drag types because they were unregistered before the drag.
-    [[self _webView] _registerDraggedTypes];
     
     // Balance the previous retain from when the drag started.
     [self release];
@@ -1705,55 +1699,75 @@ static WebHTMLView *lastHitView = nil;
     return [NSArray arrayWithObject:[path lastPathComponent]];
 }
 
-- (NSDragOperation)_dragOperationForDraggingInfo:(id <NSDraggingInfo>)sender
+- (BOOL)_canProcessDragWithDraggingInfo:(id <NSDraggingInfo>)draggingInfo
 {
-    NSPoint point = [self convertPoint:[sender draggingLocation] fromView:nil];
-    NSDictionary *element = [self _elementAtPoint:point];
-    if ([[element objectForKey:WebElementDOMNodeKey] isContentEditable] && [[self _bridge] moveCaretToPoint:point]) {
-        if (_private->isDragging) {
-            if ([[element objectForKey:WebElementIsSelectedKey] boolValue]) {
-                return NSDragOperationMove;
+    if ([[draggingInfo draggingPasteboard] availableTypeFromArray:[WebHTMLView _insertablePasteboardTypes]] != nil) {
+        NSPoint point = [self convertPoint:[draggingInfo draggingLocation] fromView:nil];
+        NSDictionary *element = [self elementAtPoint:point];
+        if ([[self _webView] isEditable] || [[element objectForKey:WebElementDOMNodeKey] isContentEditable]) {
+            if (_private->initiatedDrag && [[element objectForKey:WebElementIsSelectedKey] boolValue]) {
+                // Can't drag onto the selection being dragged.
+                return NO;
             }
-        } else {
-            return NSDragOperationCopy;
+            return YES;
         }
     }
-    return NSDragOperationNone;
-}
-
-- (NSDragOperation)draggingEntered:(id <NSDraggingInfo>)sender
-{
-    // If we're not handling the drag, forward this message to the WebView since it may want to handle it.
-    NSDragOperation dragOperation = [self _dragOperationForDraggingInfo:sender];
-    return dragOperation != NSDragOperationNone ? dragOperation : [[self _webView] draggingEntered:sender];
+    return NO;
 }
 
-- (NSDragOperation)draggingUpdated:(id <NSDraggingInfo>)sender
+- (NSDragOperation)dragOperationForDraggingInfo:(id <NSDraggingInfo>)draggingInfo
 {
-    // If we're not handling the drag, forward this message to the WebView since it may want to handle it.
-    NSDragOperation dragOperation = [self _dragOperationForDraggingInfo:sender];
-    return dragOperation != NSDragOperationNone ? dragOperation : [[self _webView] draggingUpdated:sender];
+    if ([self _canProcessDragWithDraggingInfo:draggingInfo]) {
+        return _private->initiatedDrag ? NSDragOperationMove : NSDragOperationCopy;
+    }
+    return NSDragOperationNone;
 }
 
-- (BOOL)prepareForDragOperation:(id <NSDraggingInfo>)sender
+- (void)draggingUpdatedWithDraggingInfo:(id <NSDraggingInfo>)draggingInfo
 {
-    return YES;
+    if ([self _canProcessDragWithDraggingInfo:draggingInfo]) {
+        [[self _bridge] moveDragCaretToPoint:[self convertPoint:[draggingInfo draggingLocation] fromView:nil]];
+    }
 }
 
-- (BOOL)performDragOperation:(id <NSDraggingInfo>)sender
+- (BOOL)concludeDragForDraggingInfo:(id <NSDraggingInfo>)draggingInfo
 {
-    return YES;
+    if ([self _canProcessDragWithDraggingInfo:draggingInfo]) {
+        [self _pasteFromPasteboard:[draggingInfo draggingPasteboard]];
+        return YES;
+    }
+    return NO;
 }
 
-- (void)concludeDragOperation:(id <NSDraggingInfo>)sender
+- (NSDictionary *)elementAtPoint:(NSPoint)point
 {
-    if ([self _dragOperationForDraggingInfo:sender] != NSDragOperationNone) {
-        // FIXME: We should delete the original selection if we're doing a move.
-        [self _pasteFromPasteboard:[sender draggingPasteboard]];
-    } else {
-        // Since we're not handling the drag, forward this message to the WebView since it may want to handle it.
-        [[self _webView] concludeDragOperation:sender];
+    NSDictionary *elementInfoWC = [[self _bridge] elementAtPoint:point];
+    NSMutableDictionary *elementInfo = [elementInfoWC mutableCopy];
+    
+    // Convert URL strings to NSURLs
+    [elementInfo _web_setObjectIfNotNil:[NSURL _web_URLWithDataAsString:[elementInfoWC objectForKey:WebElementLinkURLKey]] forKey:WebElementLinkURLKey];
+    [elementInfo _web_setObjectIfNotNil:[NSURL _web_URLWithDataAsString:[elementInfoWC objectForKey:WebElementImageURLKey]] forKey:WebElementImageURLKey];
+    
+    WebFrameView *webFrameView = [self _web_parentWebFrameView];
+    ASSERT(webFrameView);
+    WebFrame *webFrame = [webFrameView webFrame];
+    
+    if (webFrame) {
+        NSString *frameName = [elementInfoWC objectForKey:WebElementLinkTargetFrameKey];
+        if ([frameName length] == 0) {
+            [elementInfo setObject:webFrame forKey:WebElementLinkTargetFrameKey];
+        } else {
+            WebFrame *wf = [webFrame findFrameNamed:frameName];
+            if (wf != nil)
+                [elementInfo setObject:wf forKey:WebElementLinkTargetFrameKey];
+            else
+                [elementInfo removeObjectForKey:WebElementLinkTargetFrameKey];
+        }
+        
+        [elementInfo setObject:webFrame forKey:WebElementFrameKey];
     }
+    
+    return [elementInfo autorelease];
 }
 
 - (void)mouseUp:(NSEvent *)event
diff --git a/WebKit/WebView.subproj/WebHTMLViewPrivate.h b/WebKit/WebView.subproj/WebHTMLViewPrivate.h
index 04c9abf..bfb1530 100644
--- a/WebKit/WebView.subproj/WebHTMLViewPrivate.h
+++ b/WebKit/WebView.subproj/WebHTMLViewPrivate.h
@@ -21,7 +21,7 @@
     BOOL inNextValidKeyView;
     BOOL ignoringMouseDraggedEvents;
     BOOL printing;
-    BOOL isDragging;
+    BOOL initiatedDrag;
     
     id savedSubviews;
     BOOL subviewsSetAside;
@@ -61,8 +61,6 @@
 + (void)_postFlagsChangedEvent:(NSEvent *)flagsChangedEvent;
 - (void)_updateMouseoverWithFakeEvent;
 
-- (NSDictionary *)_elementAtPoint:(NSPoint)point;
-
 - (void)_setAsideSubviews;
 - (void)_restoreSubviews;
 
@@ -70,11 +68,11 @@
 - (void)_clearLastHitViewIfSelf;
 - (void)_updateMouseoverWithEvent:(NSEvent *)event;
 
++ (NSArray *)_insertablePasteboardTypes;
 + (NSArray *)_selectionPasteboardTypes;
 - (void)_writeSelectionToPasteboard:(NSPasteboard *)pasteboard;
 - (WebArchive *)_selectedArchive:(NSString **)markupString;
 - (NSData *)_selectedRTFData;
-
 - (BOOL)_canDelete;
 - (BOOL)_canPaste;
 - (BOOL)_haveSelection;
diff --git a/WebKit/WebView.subproj/WebImageView.h b/WebKit/WebView.subproj/WebImageView.h
index 50ac401..802b9ed 100644
--- a/WebKit/WebView.subproj/WebImageView.h
+++ b/WebKit/WebView.subproj/WebImageView.h
@@ -3,15 +3,16 @@
 	Copyright 2002, Apple, Inc. All rights reserved.
 */
 
-#import <WebKit/WebDocumentPrivate.h>
+#import <WebKit/WebDocumentInternal.h>
 
 @class WebImageRepresentation;
 
- at interface WebImageView : NSView <WebDocumentView, WebDocumentImage>
+ at interface WebImageView : NSView <WebDocumentView, WebDocumentImage, WebDocumentElement>
 {
     WebImageRepresentation *rep;
     BOOL needsLayout;
     BOOL ignoringMouseDraggedEvents;
+    NSEvent *mouseDownEvent;
 }
 + (NSArray *)supportedImageMIMETypes;
 @end
diff --git a/WebKit/WebView.subproj/WebImageView.m b/WebKit/WebView.subproj/WebImageView.m
index 3319093..ce3d330 100644
--- a/WebKit/WebView.subproj/WebImageView.m
+++ b/WebKit/WebView.subproj/WebImageView.m
@@ -44,6 +44,7 @@
 {
     [[rep image] stopAnimation];
     [rep release];
+    [mouseDownEvent release];
     
     [super dealloc];
 }
@@ -194,39 +195,49 @@
     return [self writeImageToPasteboard:pasteboard types:types];
 }
 
-- (NSMenu *)menuForEvent:(NSEvent *)theEvent
+- (NSDictionary *)elementAtPoint:(NSPoint)point
 {
-    WebFrameView *webFrameView = [self _web_parentWebFrameView];
-    WebView *webView = [webFrameView _webView];
-    WebFrame *frame = [webFrameView webFrame];
-
+    WebFrame *frame = [[self _web_parentWebFrameView] webFrame];
     ASSERT(frame);
-    ASSERT(webView);
     
-    NSDictionary *element = [NSDictionary dictionaryWithObjectsAndKeys:
+    return [NSDictionary dictionaryWithObjectsAndKeys:
         [rep image],                            WebElementImageKey,
         [NSValue valueWithRect:[self bounds]], 	WebElementImageRectKey,
         [rep URL],                              WebElementImageURLKey,
         [NSNumber numberWithBool:NO], 		WebElementIsSelectedKey,
         frame, 					WebElementFrameKey, nil];
-        
-    return [webView _menuForElement:element];
+}
+
+- (NSMenu *)menuForEvent:(NSEvent *)theEvent
+{
+    WebView *webView = [[self _web_parentWebFrameView] _webView];
+    ASSERT(webView);
+    return [webView _menuForElement:[self elementAtPoint:NSZeroPoint]];
 }
 
 - (void)mouseDown:(NSEvent *)event
 {
-    ignoringMouseDraggedEvents = NO;
+    [mouseDownEvent release];
+    mouseDownEvent = [event retain];
     [super mouseDown:event];
 }
 
-- (void)mouseDragged:(NSEvent *)event
+- (void)mouseDragged:(NSEvent *)mouseDraggedEvent
 {
     if (ignoringMouseDraggedEvents || ![self haveCompleteImage]) {
         return;
     }
     
-    // Don't allow drags to be accepted by this WebFrameView.
-    [[[self _web_parentWebFrameView] _webView] unregisterDraggedTypes];
+    WebView *webView = [[self _web_parentWebFrameView] _webView];
+    if (![[webView _UIDelegateForwarder] webView:webView
+                       shouldBeginDragForElement:[self elementAtPoint:NSZeroPoint] 
+                                       dragImage:[rep image] 
+                                  mouseDownEvent:mouseDownEvent 
+                               mouseDraggedEvent:mouseDraggedEvent]) {
+        return;   
+    }
+    
+    [[[self _web_parentWebFrameView] _webView] _setInitiatedDrag:YES];
 
     // Retain this view during the drag because it may be released before the drag ends.
     [self retain];
@@ -236,7 +247,7 @@
                     rect:[self drawingRect]
                      URL:[rep URL]
                    title:nil
-                   event:event];
+                   event:mouseDraggedEvent];
 }
 
 - (NSArray *)namesOfPromisedFilesDroppedAtDestination:(NSURL *)dropDestination
@@ -253,8 +264,7 @@
     // Prevent queued mouseDragged events from coming after the drag which can cause a double drag.
     ignoringMouseDraggedEvents = YES;
     
-    // Reregister for drag types because they were unregistered before the drag.
-    [[[self _web_parentWebFrameView] _webView] _registerDraggedTypes];
+    [[[self _web_parentWebFrameView] _webView] _setInitiatedDrag:NO];
 
     // Balance the previous retain from when the drag started.
     [self release];
diff --git a/WebKit/WebView.subproj/WebTextView.h b/WebKit/WebView.subproj/WebTextView.h
index 36f12b6..dc48895 100644
--- a/WebKit/WebView.subproj/WebTextView.h
+++ b/WebKit/WebView.subproj/WebTextView.h
@@ -3,12 +3,12 @@
     Copyright 2002, Apple, Inc. All rights reserved.
 */
 
-#import <WebKit/WebDocumentPrivate.h>
+#import <WebKit/WebDocumentInternal.h>
 #import <WebKit/WebSearchableTextView.h>
 
 @class WebDataSource;
 
- at interface WebTextView : WebSearchableTextView <WebDocumentView, WebDocumentText, WebDocumentSelection>
+ at interface WebTextView : WebSearchableTextView <WebDocumentView, WebDocumentText, WebDocumentElement, WebDocumentSelection>
 {
     float _textSizeMultiplier;
 }
diff --git a/WebKit/WebView.subproj/WebTextView.m b/WebKit/WebView.subproj/WebTextView.m
index b9af685..857cb73 100644
--- a/WebKit/WebView.subproj/WebTextView.m
+++ b/WebKit/WebView.subproj/WebTextView.m
@@ -260,23 +260,29 @@
     [[self nextResponder] keyUp:event];
 }
 
-- (NSMenu *)menuForEvent:(NSEvent *)event
-{    
-    WebFrameView *webFrameView = [self _web_parentWebFrameView];
-    WebView *webView = [webFrameView _webView];
-    WebFrame *frame = [webFrameView webFrame];
-
+- (NSDictionary *)_elementAtWindowPoint:(NSPoint)windowPoint
+{
+    WebFrame *frame = [[self _web_parentWebFrameView] webFrame];
     ASSERT(frame);
-    ASSERT(webView);
-
-    NSPoint point = [[event window] convertBaseToScreen:[event locationInWindow]];
-    BOOL isPointSelected = NSLocationInRange([self characterIndexForPoint:point], [self selectedRange]);
     
-    NSDictionary *element = [NSDictionary dictionaryWithObjectsAndKeys:
+    NSPoint screenPoint = [[self window] convertBaseToScreen:windowPoint];
+    BOOL isPointSelected = NSLocationInRange([self characterIndexForPoint:screenPoint], [self selectedRange]);
+    return [NSDictionary dictionaryWithObjectsAndKeys:
         [NSNumber numberWithBool:isPointSelected], WebElementIsSelectedKey,
         frame, WebElementFrameKey, nil];
+}
+
+- (NSDictionary *)elementAtPoint:(NSPoint)point
+{
+    return [self _elementAtWindowPoint:[self convertPoint:point toView:nil]];
+}
+
+- (NSMenu *)menuForEvent:(NSEvent *)event
+{    
+    WebView *webView = [[self _web_parentWebFrameView] _webView];
+    ASSERT(webView);
 
-    return [webView _menuForElement:element];
+    return [webView _menuForElement:[self _elementAtWindowPoint:[event locationInWindow]]];
 }
 
 - (NSArray *)pasteboardTypesForSelection
diff --git a/WebKit/WebView.subproj/WebView.h b/WebKit/WebView.subproj/WebView.h
index 2c1e88a..ff2c337 100644
--- a/WebKit/WebView.subproj/WebView.h
+++ b/WebKit/WebView.subproj/WebView.h
@@ -141,7 +141,7 @@ extern NSString *WebViewProgressFinishedNotification;
     @discussion This method returns a title that refers a URL on the pasteboard. An example of this is the link label
     which is the text inside the anchor tag.
 */
-+ (NSURL *)URLTitleFromPasteboard:(NSPasteboard *)pasteboard;
++ (NSString *)URLTitleFromPasteboard:(NSPasteboard *)pasteboard;
 
 /*!
     @method initWithFrame:frameName:groupName:
diff --git a/WebKit/WebView.subproj/WebView.m b/WebKit/WebView.subproj/WebView.m
index 23c3a44..e0825d4 100644
--- a/WebKit/WebView.subproj/WebView.m
+++ b/WebKit/WebView.subproj/WebView.m
@@ -153,9 +153,7 @@ NSString *_WebMainFrameURLKey =         @"mainFrameURL";
     [editingDelegateForwarder release];
     
     [progressItems release];
-    
-    [draggedTypes release];
-    
+        
     [mediaStyle release];
     
     [super dealloc];
@@ -731,30 +729,6 @@ NSString *_WebMainFrameURLKey =         @"mainFrameURL";
     return [self _frameForView: aView fromFrame: frame];
 }
 
-- (void)_setDraggedTypes:(NSArray *)draggedTypes
-{
-    [draggedTypes retain];
-    [_private->draggedTypes release];
-    _private->draggedTypes = draggedTypes;
-}
-
-- (void)unregisterDraggedTypes
-{
-    [self _setDraggedTypes:nil];
-    [super unregisterDraggedTypes];
-}
-
-- (void)registerForDraggedTypes:(NSArray *)draggedTypes
-{
-    [self _setDraggedTypes:draggedTypes];
-    [super registerForDraggedTypes:draggedTypes];
-}
-
-- (void)_registerDraggedTypes
-{
-    [self registerForDraggedTypes:[NSPasteboard _web_dragTypesForURL]];
-}
-
 - (void)_closeWindow
 {
     [[self _UIDelegateForwarder] webViewClose:self];
@@ -1128,6 +1102,11 @@ NSString *_WebMainFrameURLKey =         @"mainFrameURL";
                         types:types];
 }
 
+- (void)_setInitiatedDrag:(BOOL)initiatedDrag
+{
+    _private->initiatedDrag = initiatedDrag;
+}
+
 @end
 
 
@@ -1231,14 +1210,22 @@ NSMutableDictionary *countInvocations;
 
 + (NSURL *)URLFromPasteboard:(NSPasteboard *)pasteboard
 {
-    ERROR("unimplemented");
-    return nil;
+    return [pasteboard _web_bestURL];
 }
 
-+ (NSURL *)URLTitleFromPasteboard:(NSPasteboard *)pasteboard
++ (NSString *)URLTitleFromPasteboard:(NSPasteboard *)pasteboard
 {
-    ERROR("unimplemented");
-    return nil;
+    return [pasteboard stringForType:WebURLNamePboardType];
+}
+
+- (void)_registerDraggedTypes
+{
+    NSArray *editableTypes = [WebHTMLView _insertablePasteboardTypes];
+    NSArray *URLTypes = [NSPasteboard _web_dragTypesForURL];
+    NSMutableSet *types = [[NSMutableSet alloc] initWithArray:editableTypes];
+    [types addObjectsFromArray:URLTypes];
+    [self registerForDraggedTypes:[types allObjects]];
+    [types release];
 }
 
 - (void)_commonInitializationWithFrameName:(NSString *)frameName groupName:(NSString *)groupName
@@ -1668,43 +1655,106 @@ NS_ENDHANDLER
     return _private->hostWindow;
 }
 
-- (NSDragOperation)dragOperationForDraggingInfo:(id <NSDraggingInfo>)sender
+- (WebFrameView *)_frameViewAtWindowPoint:(NSPoint)point
 {
-    // Even though we may not be registered for any drag types, we may still get drag messages forwarded from WebHTMLView,
-    // so compare the types on the pasteboard against the types we're currently registered for.
-    NSPoint point = [[self superview] convertPoint:[sender draggingLocation] toView:nil];
-    if ([_private->draggedTypes count] > 0 && 
-        [[sender draggingPasteboard] availableTypeFromArray:_private->draggedTypes] != nil &&
-        ![[self hitTest:point] isKindOfClass:[WebBaseNetscapePluginView class]]) {
-        return [self _web_dragOperationForDraggingInfo:sender];
+    NSView *view = [self hitTest:[[self superview] convertPoint:point toView:nil]];
+    return (WebFrameView *)[view _web_superviewOfClass:[WebFrameView class] stoppingAtClass:[self class]];
+}
+
+- (NSView <WebDocumentDragging> *)_draggingDocumentViewAtWindowPoint:(NSPoint)point
+{
+    NSView <WebDocumentView> *documentView = [[self _frameViewAtWindowPoint:point] documentView];
+    if ([documentView conformsToProtocol:@protocol(WebDocumentDragging)]) {
+        return (NSView <WebDocumentDragging> *)documentView;
+    }
+    return nil;
+}
+
+- (NSDictionary *)_elementAtWindowPoint:(NSPoint)windowPoint
+{
+    WebFrameView *frameView = [self _frameViewAtWindowPoint:windowPoint];
+    NSView <WebDocumentView> *documentView = [frameView documentView];
+    if ([documentView conformsToProtocol:@protocol(WebDocumentElement)]) {
+        NSPoint point = [documentView convertPoint:windowPoint fromView:nil];
+        return [(NSView <WebDocumentElement> *)documentView elementAtPoint:point];
+    } else {
+        return [NSDictionary dictionaryWithObject:[frameView webFrame] forKey:WebElementFrameKey];
+    }
+}
+
+- (NSDragOperation)dragOperationForDraggingInfo:(id <NSDraggingInfo>)draggingInfo
+{    
+    // Allow the document view to handle the drag.
+    NSPoint windowPoint = [draggingInfo draggingLocation];
+    NSView <WebDocumentDragging> *draggingView = [self _draggingDocumentViewAtWindowPoint:windowPoint];
+    if (draggingView) {
+        NSDragOperation operation = [draggingView dragOperationForDraggingInfo:draggingInfo];
+        if (operation != NSDragOperationNone) {
+            return operation;
+        }
+    }
+ 
+    // Don't accept the drag over a plug-in since plug-ins may want to handle it.
+    NSView *view = [self hitTest:[[self superview] convertPoint:windowPoint toView:nil]];
+    if ([view isKindOfClass:[WebBaseNetscapePluginView class]]) {
+        return NSDragOperationNone;
     }
+    
+    // If not editing or dragging, use _web_dragOperationForDraggingInfo to find a URL to load on the pasteboard.
+    if (!_private->editable && !_private->initiatedDrag) {
+        return [self _web_dragOperationForDraggingInfo:draggingInfo];
+    }
+    
     return NSDragOperationNone;
 }
 
-- (NSDragOperation)draggingEntered:(id <NSDraggingInfo>)sender
+- (NSDragOperation)_dragOperationForDraggingInfo:(id <NSDraggingInfo>)draggingInfo
+{
+    NSPoint windowPoint = [draggingInfo draggingLocation];
+    NSDragOperation operation = [[self _UIDelegateForwarder] webView:self 
+                                        dragOperationForDraggingInfo:draggingInfo 
+                                                         overElement:[self _elementAtWindowPoint:windowPoint]];
+    if (operation != NSDragOperationNone) {
+        [[self _draggingDocumentViewAtWindowPoint:windowPoint] draggingUpdatedWithDraggingInfo:draggingInfo];
+    }
+    return operation;
+}
+
+- (NSDragOperation)draggingEntered:(id <NSDraggingInfo>)draggingInfo
 {
-    return [self dragOperationForDraggingInfo:sender];
+    return [self _dragOperationForDraggingInfo:draggingInfo];
 }
 
-- (NSDragOperation)draggingUpdated:(id <NSDraggingInfo>)sender
+- (NSDragOperation)draggingUpdated:(id <NSDraggingInfo>)draggingInfo
 {
-    return [self dragOperationForDraggingInfo:sender];
+    return [self _dragOperationForDraggingInfo:draggingInfo];
 }
 
-- (BOOL)prepareForDragOperation:(id <NSDraggingInfo>)sender
+- (BOOL)prepareForDragOperation:(id <NSDraggingInfo>)draggingInfo
 {
     return YES;
 }
 
-- (BOOL)performDragOperation:(id <NSDraggingInfo>)sender
+- (BOOL)performDragOperation:(id <NSDraggingInfo>)draggingInfo
 {
     return YES;
 }
 
-- (void)concludeDragOperation:(id <NSDraggingInfo>)sender
+- (void)concludeDragOperation:(id <NSDraggingInfo>)draggingInfo
 {
-    if ([self dragOperationForDraggingInfo:sender] != NSDragOperationNone) {
-        NSURL *URL = [[sender draggingPasteboard] _web_bestURL];
+    NSPoint windowPoint = [draggingInfo draggingLocation];
+    if (![[self _UIDelegateForwarder] webView:self 
+            shouldProcessDragWithDraggingInfo:draggingInfo 
+                                  overElement:[self _elementAtWindowPoint:windowPoint]]) {
+        return;
+    }
+    
+    if ([[self _draggingDocumentViewAtWindowPoint:windowPoint] concludeDragForDraggingInfo:draggingInfo]) {
+        return;
+    }
+    
+    if (!_private->editable && !_private->initiatedDrag) {
+        NSURL *URL = [[self class] URLFromPasteboard:[draggingInfo draggingPasteboard]];
         if (URL) {
             NSURLRequest *request = [[NSURLRequest alloc] initWithURL:URL];
             [[self mainFrame] loadRequest:request];
diff --git a/WebKit/WebView.subproj/WebViewPrivate.h b/WebKit/WebView.subproj/WebViewPrivate.h
index b5bbd8b..f12bd5e 100644
--- a/WebKit/WebView.subproj/WebViewPrivate.h
+++ b/WebKit/WebView.subproj/WebViewPrivate.h
@@ -91,9 +91,9 @@ extern NSString *_WebMainFrameURLKey;
     
     void *observationInfo;
     
-    NSArray *draggedTypes;
     BOOL drawsBackground;
     BOOL editable;
+    BOOL initiatedDrag;
     
     NSString *mediaStyle;
 }
@@ -211,7 +211,7 @@ Could be worth adding to the API.
 
 - (void)_closeWindow;
 
-- (void)_registerDraggedTypes;
+- (void)_setInitiatedDrag:(BOOL)initiatedDrag;
 
 - (void)_close;
 

-- 
WebKit Debian packaging



More information about the Pkg-webkit-commits mailing list