[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