[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:24:58 UTC 2009


The following commit has been merged in the debian/unstable branch:
commit e6c0ce365423f17dc4e5a5de7e949a185b2e038c
Author: cblu <cblu at 268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date:   Mon Feb 2 17:47:31 2004 +0000

    WebCore:
    
    	Fixed: <rdar://problem/3546379>: support for editing via drag & drop
    
            Reviewed by kocienda.
    
            * khtml/xml/dom_docimpl.cpp:
            (DocumentImpl::deleteSelection): fixed a crash I encountered while attempting to delete and empty selection
            * kwq/WebCoreBridge.h:
            * kwq/WebCoreBridge.mm:
            (-[WebCoreBridge isSelectionEditable]): renamed from isEditable
            (-[WebCoreBridge moveCaretToPoint:]): new
            (-[WebCoreBridge elementAtPoint:]): added support for WebCoreElementHTMLStringKey and WebCoreElementIsEditableKey
    
    WebKit:
    
    	Fixed: <rdar://problem/3546379>: support for editing via drag & drop
    
            Reviewed by kocienda.
    
            * Misc.subproj/WebNSViewExtras.h:
            * Misc.subproj/WebNSViewExtras.m:
            (-[NSView _web_dragImage:fileWrapper:rect:URL:title:HTMLString:event:]): added a HTMLString argument so that we retain all attributes when dragging images
            * WebView.subproj/WebHTMLView.m:
            (-[WebHTMLView _canDelete]): call renamed isSelectionEditable
            (-[WebHTMLView _canPaste]): call renamed isSelectionEditable
            (-[WebHTMLView _pasteHTMLFromPasteboard:]): new, factored out from paste:
            (-[WebHTMLView _handleMouseDragged:]): removed code that returned early if we were loading, this kind of protection is no longer needed since we now retain the view while dragging, call renamed _web_dragImage
            (-[WebHTMLView initWithFrame:]): register for drop types
            (-[WebHTMLView paste:]): call _pasteHTMLFromPasteboard
            (-[WebHTMLView dragImage:at:offset:event:pasteboard:source:slideBack:]): set new isDragging BOOL to YES
            (-[WebHTMLView draggedImage:endedAt:operation:]): set new isDragging BOOL to NO
            (-[WebHTMLView draggingEntered:]): new
            (-[WebHTMLView draggingUpdated:]): new, handle caret movement during the drag
            (-[WebHTMLView prepareForDragOperation:]): new
            (-[WebHTMLView performDragOperation:]): new
            (-[WebHTMLView concludeDragOperation:]): new, paste in the drag
            * WebView.subproj/WebHTMLViewPrivate.h:
            * WebView.subproj/WebImageView.m:
            (-[WebImageView mouseDragged:]): call renamed _web_dragImage
            * WebView.subproj/WebView.h:
            * WebView.subproj/WebView.m:
    
    
    git-svn-id: http://svn.webkit.org/repository/webkit/trunk@6019 268f45cc-cd09-0410-ab3c-d52691b4dbfc

diff --git a/WebCore/ChangeLog-2005-08-23 b/WebCore/ChangeLog-2005-08-23
index af6941e..a68df0f 100644
--- a/WebCore/ChangeLog-2005-08-23
+++ b/WebCore/ChangeLog-2005-08-23
@@ -1,3 +1,17 @@
+2004-02-02  Chris Blumenberg  <cblu at apple.com>
+
+	Fixed: <rdar://problem/3546379>: support for editing via drag & drop
+
+        Reviewed by kocienda.
+
+        * khtml/xml/dom_docimpl.cpp:
+        (DocumentImpl::deleteSelection): fixed a crash I encountered while attempting to delete and empty selection
+        * kwq/WebCoreBridge.h:
+        * kwq/WebCoreBridge.mm:
+        (-[WebCoreBridge isSelectionEditable]): renamed from isEditable
+        (-[WebCoreBridge moveCaretToPoint:]): new
+        (-[WebCoreBridge elementAtPoint:]): added support for WebCoreElementHTMLStringKey and WebCoreElementIsEditableKey
+
 2004-01-30  David Hyatt  <hyatt at apple.com>
 
 	Fix for 3522497, <br>s should not get AXObjects created.
diff --git a/WebCore/khtml/xml/dom_docimpl.cpp b/WebCore/khtml/xml/dom_docimpl.cpp
index 65549ec..3dcd01e 100644
--- a/WebCore/khtml/xml/dom_docimpl.cpp
+++ b/WebCore/khtml/xml/dom_docimpl.cpp
@@ -1202,9 +1202,11 @@ void DocumentImpl::clearSelection()
 void DocumentImpl::deleteSelection()
 {
     KHTMLSelection &selection = part()->getKHTMLSelection();
-	clearSelection();
-    Range range(selection.startNode(), selection.startOffset(), selection.endNode(), selection.endOffset());
-    range.deleteContents();
+    if (!selection.isEmpty()) {
+        clearSelection();
+        Range range(selection.startNode(), selection.startOffset(), selection.endNode(), selection.endOffset());
+        range.deleteContents();
+    }
 }
 
 void DocumentImpl::pasteHTMLString(const QString &HTMLString)
diff --git a/WebCore/kwq/WebCoreBridge.h b/WebCore/kwq/WebCoreBridge.h
index 33cd563..93916ea 100644
--- a/WebCore/kwq/WebCoreBridge.h
+++ b/WebCore/kwq/WebCoreBridge.h
@@ -64,10 +64,12 @@ typedef khtml::RenderPart KHTMLRenderPart;
 @protocol WebDOMElement;
 
 extern NSString *WebCoreElementFrameKey;
+extern NSString *WebCoreElementHTMLStringKey;
 extern NSString *WebCoreElementImageAltStringKey;
 extern NSString *WebCoreElementImageKey;
 extern NSString *WebCoreElementImageRectKey;
 extern NSString *WebCoreElementImageURLKey;
+extern NSString *WebCoreElementIsEditableKey;
 extern NSString *WebCoreElementIsSelectedKey;
 extern NSString *WebCoreElementLinkURLKey;
 extern NSString *WebCoreElementLinkTargetFrameKey;
@@ -200,7 +202,9 @@ typedef enum {
 
 - (void)setSelectionFrom:(id <WebDOMNode>)start startOffset:(int)startOffset to:(id <WebDOMNode>)end endOffset:(int) endOffset;
 
-- (BOOL)isEditable;
+- (BOOL)isSelectionEditable;
+- (BOOL)moveCaretToPoint:(NSPoint)point;
+
 - (void)pasteHTMLString:(NSString *)HTMLString;
 - (void)deleteSelection;
 
diff --git a/WebCore/kwq/WebCoreBridge.mm b/WebCore/kwq/WebCoreBridge.mm
index 11b3000..10c133a 100644
--- a/WebCore/kwq/WebCoreBridge.mm
+++ b/WebCore/kwq/WebCoreBridge.mm
@@ -90,18 +90,20 @@ using KParts::URLArgs;
 
 using KJS::Bindings::RootObject;
 
-NSString *WebCoreElementFrameKey = 		@"WebElementFrame";
+NSString *WebCoreElementFrameKey =              @"WebElementFrame";
+NSString *WebCoreElementHTMLStringKey =         @"WebElementHTMLString";
 NSString *WebCoreElementImageAltStringKey = 	@"WebElementImageAltString";
-NSString *WebCoreElementImageKey = 		@"WebElementImage";
-NSString *WebCoreElementImageRectKey = 		@"WebElementImageRect";
-NSString *WebCoreElementImageURLKey = 		@"WebElementImageURL";
-NSString *WebCoreElementIsSelectedKey = 	@"WebElementIsSelected";
-NSString *WebCoreElementLinkURLKey = 		@"WebElementLinkURL";
+NSString *WebCoreElementImageKey =              @"WebElementImage";
+NSString *WebCoreElementImageRectKey =          @"WebElementImageRect";
+NSString *WebCoreElementImageURLKey =           @"WebElementImageURL";
+NSString *WebCoreElementIsEditableKey =         @"WebElementIsEditable";
+NSString *WebCoreElementIsSelectedKey =         @"WebElementIsSelected";
+NSString *WebCoreElementLinkURLKey =            @"WebElementLinkURL";
 NSString *WebCoreElementLinkTargetFrameKey =	@"WebElementTargetFrame";
-NSString *WebCoreElementLinkLabelKey = 		@"WebElementLinkLabel";
-NSString *WebCoreElementLinkTitleKey = 		@"WebElementLinkTitle";
-NSString *WebCoreElementNameKey = 		@"WebElementName";
-NSString *WebCoreElementTitleKey = 		@"WebCoreElementTitle"; // not in WebKit API for now, could be in API some day
+NSString *WebCoreElementLinkLabelKey =          @"WebElementLinkLabel";
+NSString *WebCoreElementLinkTitleKey =          @"WebElementLinkTitle";
+NSString *WebCoreElementNameKey =               @"WebElementName";
+NSString *WebCoreElementTitleKey =              @"WebCoreElementTitle"; // not in WebKit API for now, could be in API some day
 
 NSString *WebCorePageCacheStateKey =            @"WebCorePageCacheState";
 
@@ -356,12 +358,42 @@ static bool initializedKJS = FALSE;
     _part->gotoAnchor(QString::fromNSString(a));
 }
 
-- (BOOL)isEditable
+- (BOOL)isSelectionEditable
 {
 	NodeImpl *startNode = _part->getKHTMLSelection().startNode();
 	return startNode ? startNode->isContentEditable() : NO;
 }
 
+- (BOOL)moveCaretToPoint:(NSPoint)point
+{
+    RenderObject *renderer = _part->renderer();
+    if (!renderer) {
+        return NO;
+    }
+    
+    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;
+    }
+        
+    NodeImpl *tempNode;
+    int absX = 0;
+    int absY = 0;
+    int offset;
+    node->renderer()->absolutePosition(absX, absY);
+    node->renderer()->checkSelectionPoint((int)point.x, (int)point.y, absX, absY, tempNode, offset);
+    
+    KHTMLSelection &selection = _part->getKHTMLSelection();
+    selection.setSelection(node, offset);
+    _part->xmlDocImpl()->setSelection(selection);
+    
+    return YES;
+}
+
 - (void)pasteHTMLString:(NSString *)HTMLString
 {
 	DocumentImpl *doc = _part->xmlDocImpl();
@@ -790,7 +822,7 @@ static HTMLFormElementImpl *formElementFromDOMElement(id <WebDOMElement>element)
     NSMutableDictionary *element = [NSMutableDictionary dictionary];
     [element setObject:[NSNumber numberWithBool:_part->isPointInsideSelection((int)point.x, (int)point.y)]
                 forKey:WebCoreElementIsSelectedKey];
-
+    
     // Find the title in the nearest enclosing DOM node.
     // For <area> tags in image maps, walk the tree for the <area>, not the <img> using it.
     for (NodeImpl *titleNode = nodeInfo.innerNode(); titleNode; titleNode = titleNode->parentNode()) {
@@ -842,44 +874,52 @@ static HTMLFormElementImpl *formElementFromDOMElement(id <WebDOMElement>element)
     }
 
     NodeImpl *node = nodeInfo.innerNonSharedNode();
-    if (node && node->renderer() && node->renderer()->isImage()) {
-        
-        RenderImage *r = static_cast<RenderImage *>(node->renderer());
-        NSImage *image = r->pixmap().image();
-        // Only return image information if there is an image.
-        if (image && !r->isDisplayingError()) {
-            [element setObject:r->pixmap().image() forKey:WebCoreElementImageKey];
-            
-            int x, y;
-            if (r->absolutePosition(x, y)) {
-                NSValue *rect = [NSValue valueWithRect:NSMakeRect(x, y, r->contentWidth(), r->contentHeight())];
-                [element setObject:rect forKey:WebCoreElementImageRectKey];
-            }
-            
-            ElementImpl *i = static_cast<ElementImpl*>(node);
+    if (node) {
+        [element setObject:[NSNumber numberWithBool:node->isContentEditable()]
+                    forKey:WebCoreElementIsEditableKey];
+        NSString *HTMLString = node->recursive_toHTML(true).getNSString();
+        if ([HTMLString length] != 0) {
+            [element setObject:HTMLString forKey:WebCoreElementHTMLStringKey];
+        }
     
-            // FIXME: Code copied from RenderImage::updateFromElement; should share.
-            DOMString attr;
-            if (idFromNode(i) == ID_OBJECT) {
-                attr = i->getAttribute(ATTR_DATA);
-            } else {
-                attr = i->getAttribute(ATTR_SRC);
-            }
-            if (!attr.isEmpty()) {
-                QString URLString = parseURL(attr).string();
-                [element setObject:_part->xmlDocImpl()->completeURL(URLString).getNSString() forKey:WebCoreElementImageURLKey];
-            }
-            
-            // FIXME: Code copied from RenderImage::updateFromElement; should share.
-            DOMString alt;
-            if (idFromNode(i) == ID_INPUT)
-                alt = static_cast<HTMLInputElementImpl *>(i)->altText();
-            else if (idFromNode(i) == ID_IMG)
-                alt = static_cast<HTMLImageElementImpl *>(i)->altText();
-            if (!alt.isNull()) {
-                QString altText = alt.string();
-                altText.replace('\\', _part->backslashAsCurrencySymbol());
-                [element setObject:altText.getNSString() forKey:WebCoreElementImageAltStringKey];
+        if (node->renderer() && node->renderer()->isImage()) {
+            RenderImage *r = static_cast<RenderImage *>(node->renderer());
+            NSImage *image = r->pixmap().image();
+            // Only return image information if there is an image.
+            if (image && !r->isDisplayingError()) {
+                [element setObject:r->pixmap().image() forKey:WebCoreElementImageKey];
+                
+                int x, y;
+                if (r->absolutePosition(x, y)) {
+                    NSValue *rect = [NSValue valueWithRect:NSMakeRect(x, y, r->contentWidth(), r->contentHeight())];
+                    [element setObject:rect forKey:WebCoreElementImageRectKey];
+                }
+                
+                ElementImpl *i = static_cast<ElementImpl*>(node);
+        
+                // FIXME: Code copied from RenderImage::updateFromElement; should share.
+                DOMString attr;
+                if (idFromNode(i) == ID_OBJECT) {
+                    attr = i->getAttribute(ATTR_DATA);
+                } else {
+                    attr = i->getAttribute(ATTR_SRC);
+                }
+                if (!attr.isEmpty()) {
+                    QString URLString = parseURL(attr).string();
+                    [element setObject:_part->xmlDocImpl()->completeURL(URLString).getNSString() forKey:WebCoreElementImageURLKey];
+                }
+                
+                // FIXME: Code copied from RenderImage::updateFromElement; should share.
+                DOMString alt;
+                if (idFromNode(i) == ID_INPUT)
+                    alt = static_cast<HTMLInputElementImpl *>(i)->altText();
+                else if (idFromNode(i) == ID_IMG)
+                    alt = static_cast<HTMLImageElementImpl *>(i)->altText();
+                if (!alt.isNull()) {
+                    QString altText = alt.string();
+                    altText.replace('\\', _part->backslashAsCurrencySymbol());
+                    [element setObject:altText.getNSString() forKey:WebCoreElementImageAltStringKey];
+                }
             }
         }
     }
diff --git a/WebKit/ChangeLog b/WebKit/ChangeLog
index 865ec0c..ab12eaa 100644
--- a/WebKit/ChangeLog
+++ b/WebKit/ChangeLog
@@ -1,3 +1,32 @@
+2004-02-02  Chris Blumenberg  <cblu at apple.com>
+
+	Fixed: <rdar://problem/3546379>: support for editing via drag & drop
+
+        Reviewed by kocienda.
+
+        * Misc.subproj/WebNSViewExtras.h:
+        * Misc.subproj/WebNSViewExtras.m:
+        (-[NSView _web_dragImage:fileWrapper:rect:URL:title:HTMLString:event:]): added a HTMLString argument so that we retain all attributes when dragging images
+        * WebView.subproj/WebHTMLView.m:
+        (-[WebHTMLView _canDelete]): call renamed isSelectionEditable
+        (-[WebHTMLView _canPaste]): call renamed isSelectionEditable
+        (-[WebHTMLView _pasteHTMLFromPasteboard:]): new, factored out from paste:
+        (-[WebHTMLView _handleMouseDragged:]): removed code that returned early if we were loading, this kind of protection is no longer needed since we now retain the view while dragging, call renamed _web_dragImage
+        (-[WebHTMLView initWithFrame:]): register for drop types
+        (-[WebHTMLView paste:]): call _pasteHTMLFromPasteboard
+        (-[WebHTMLView dragImage:at:offset:event:pasteboard:source:slideBack:]): set new isDragging BOOL to YES
+        (-[WebHTMLView draggedImage:endedAt:operation:]): set new isDragging BOOL to NO
+        (-[WebHTMLView draggingEntered:]): new
+        (-[WebHTMLView draggingUpdated:]): new, handle caret movement during the drag
+        (-[WebHTMLView prepareForDragOperation:]): new
+        (-[WebHTMLView performDragOperation:]): new
+        (-[WebHTMLView concludeDragOperation:]): new, paste in the drag
+        * WebView.subproj/WebHTMLViewPrivate.h:
+        * WebView.subproj/WebImageView.m:
+        (-[WebImageView mouseDragged:]): call renamed _web_dragImage
+        * WebView.subproj/WebView.h:
+        * WebView.subproj/WebView.m:
+
 === Safari-126 ===
 
 2004-01-30  Chris Blumenberg  <cblu at apple.com>
diff --git a/WebKit/Misc.subproj/WebNSViewExtras.h b/WebKit/Misc.subproj/WebNSViewExtras.h
index d402679..8d19b43 100644
--- a/WebKit/Misc.subproj/WebNSViewExtras.h
+++ b/WebKit/Misc.subproj/WebNSViewExtras.h
@@ -45,5 +45,6 @@
                   rect:(NSRect)rect
                    URL:(NSURL *)URL
                  title:(NSString *)title
+            HTMLString:(NSString *)HTMLString
                  event:(NSEvent *)event;
 @end
diff --git a/WebKit/Misc.subproj/WebNSViewExtras.m b/WebKit/Misc.subproj/WebNSViewExtras.m
index 279c00c..bed9429 100644
--- a/WebKit/Misc.subproj/WebNSViewExtras.m
+++ b/WebKit/Misc.subproj/WebNSViewExtras.m
@@ -182,6 +182,7 @@
                   rect:(NSRect)rect
                    URL:(NSURL *)URL
                  title:(NSString *)title
+            HTMLString:(NSString *)HTMLString
                  event:(NSEvent *)event
 {
     NSPoint mouseDownPoint = [self convertPoint:[event locationInWindow] fromView:nil];
@@ -230,10 +231,16 @@
     if (fileWrapper) {
         [types insertObject:NSRTFDPboardType atIndex:0];
     }
+    if (HTMLString) {
+        [types addObject:NSHTMLPboardType];
+    }
     [pboard _web_writeURL:URL andTitle:title withOwner:self types:types];
     if (fileWrapper) {
         [pboard _web_writeFileWrapperAsRTFDAttachment:fileWrapper];
     }
+    if (HTMLString) {
+        [pboard setString:HTMLString forType:NSHTMLPboardType];
+    }
     [pboard setPropertyList:filesTypes forType:NSFilesPromisePboardType];
     [pboard setData:[image TIFFRepresentation] forType:NSTIFFPboardType];
     
diff --git a/WebKit/WebView.subproj/WebHTMLView.m b/WebKit/WebView.subproj/WebHTMLView.m
index df004d3..4669c0f 100644
--- a/WebKit/WebView.subproj/WebHTMLView.m
+++ b/WebKit/WebView.subproj/WebHTMLView.m
@@ -540,12 +540,28 @@ static WebHTMLView *lastHitView = nil;
 
 - (BOOL)_canDelete
 {
-	return [self _haveSelection] && [[self _bridge] isEditable];
+	return [self _haveSelection] && [[self _bridge] isSelectionEditable];
 }
 
 - (BOOL)_canPaste
 {
-	return [[self _bridge] isEditable];
+	return [[self _bridge] isSelectionEditable];
+}
+
+- (void)_pasteHTMLFromPasteboard:(NSPasteboard *)pasteboard
+{
+	NSArray *types = [pasteboard types];
+	NSString *HTMLString = nil;
+	
+	if ([types containsObject:NSHTMLPboardType]) {
+		HTMLString = [pasteboard stringForType:NSHTMLPboardType];
+	} else if ([types containsObject:NSStringPboardType]) {
+		HTMLString = [pasteboard stringForType:NSStringPboardType];
+	}
+	
+	if (HTMLString) {
+		[[self _bridge] pasteHTMLString:HTMLString];
+	}
 }
 
 -(NSImage *)_dragImageForLinkElement:(NSDictionary *)element
@@ -627,25 +643,19 @@ static WebHTMLView *lastHitView = nil;
 
 - (void)_handleMouseDragged:(NSEvent *)event
 {
-    // If the frame has a provisional data source, this view may be released.
-    // Don't allow drag because drag callbacks will reference this released view.
-    if ([[self _frame] provisionalDataSource]) {
-	return;
-    }
-
     NSPoint mouseDownPoint = [self convertPoint:[_private->mouseDownEvent locationInWindow] fromView:nil];
     NSDictionary *element = [self _elementAtPoint:mouseDownPoint];
 
     NSURL *linkURL = [element objectForKey:WebElementLinkURLKey];
     NSURL *imageURL = [element objectForKey:WebElementImageURLKey];
-    BOOL isSelectedText = [[element objectForKey:WebElementIsSelectedKey] boolValue];
+    BOOL isSelected = [[element objectForKey:WebElementIsSelectedKey] boolValue];
 
     [_private->draggingImageURL release];
     _private->draggingImageURL = nil;
 
     // We must have started over something draggable:
     ASSERT((imageURL && [[WebPreferences standardPreferences] loadsImagesAutomatically]) ||
-           (!imageURL && linkURL) || isSelectedText); 
+           (!imageURL && linkURL) || isSelected); 
 
     NSPoint mouseDraggedPoint = [self convertPoint:[event locationInWindow] fromView:nil];
     float deltaX = ABS(mouseDraggedPoint.x - mouseDownPoint.x);
@@ -654,8 +664,8 @@ static WebHTMLView *lastHitView = nil;
     // Drag hysteresis hasn't been met yet but we don't want to do other drag actions like selection.
     if ((imageURL && deltaX < ImageDragHysteresis && deltaY < ImageDragHysteresis) ||
         (linkURL && deltaX < LinkDragHysteresis && deltaY < LinkDragHysteresis) ||
-        (isSelectedText && deltaX < TextDragHysteresis && deltaY < TextDragHysteresis)) {
-	return;
+        (isSelected && deltaX < TextDragHysteresis && deltaY < TextDragHysteresis)) {
+        return;
     }
     
     if (imageURL) {
@@ -667,6 +677,7 @@ static WebHTMLView *lastHitView = nil;
                         rect:[[element objectForKey:WebElementImageRectKey] rectValue]
                          URL:linkURL ? linkURL : imageURL
                        title:[element objectForKey:WebElementImageAltStringKey]
+                  HTMLString:[element objectForKey:WebElementHTMLStringKey]
                        event:_private->mouseDownEvent];
         
     } else if (linkURL) {
@@ -683,7 +694,7 @@ static WebHTMLView *lastHitView = nil;
                  source:self
               slideBack:NO];
         
-    } else if (isSelectedText) {
+    } else if (isSelected) {
         NSPasteboard *pasteboard = [NSPasteboard pasteboardWithName:NSDragPboard];
         [self _writeSelectionToPasteboard:pasteboard];
         NSImage *selectionImage = [[self _bridge] selectionImage];
@@ -899,6 +910,8 @@ static WebHTMLView *lastHitView = nil;
 
     _private->pluginController = [[WebPluginController alloc] initWithHTMLView:self];
     _private->needsLayout = YES;
+	
+	[self registerForDraggedTypes:[NSArray arrayWithObjects:NSHTMLPboardType, NSStringPboardType, nil]];
 
     return self;
 }
@@ -941,19 +954,7 @@ static WebHTMLView *lastHitView = nil;
 
 - (void)paste:(id)sender
 {
-	NSPasteboard *pasteboard = [NSPasteboard generalPasteboard];
-	NSArray *types = [pasteboard types];
-	NSString *HTMLString = nil;
-	
-	if ([types containsObject:NSHTMLPboardType]) {
-		HTMLString = [pasteboard stringForType:NSHTMLPboardType];
-	} else if ([types containsObject:NSStringPboardType]) {
-		HTMLString = [pasteboard stringForType:NSStringPboardType];
-	}
-	
-	if (HTMLString) {
-		[[self _bridge] pasteHTMLString:HTMLString];
-	}
+    [self _pasteHTMLFromPasteboard:[NSPasteboard generalPasteboard]];
 }
 
 - (BOOL)writeSelectionToPasteboard:(NSPasteboard *)pasteboard types:(NSArray *)types
@@ -1504,7 +1505,9 @@ static WebHTMLView *lastHitView = nil;
        pasteboard:(NSPasteboard *)pasteboard
            source:(id)source
         slideBack:(BOOL)slideBack
-{    
+{   
+    _private->isDragging = YES;
+    
     [self _stopAutoscrollTimer];
 
     // Don't allow drags to be accepted by this WebFrameView.
@@ -1530,6 +1533,8 @@ static WebHTMLView *lastHitView = nil;
 
 - (void)draggedImage:(NSImage *)anImage endedAt:(NSPoint)aPoint operation:(NSDragOperation)operation
 {
+    _private->isDragging = NO;
+    
     // Prevent queued mouseDragged events from coming after the drag and fake mouseUp event.
     _private->ignoringMouseDraggedEvents = YES;
     
@@ -1578,6 +1583,41 @@ static WebHTMLView *lastHitView = nil;
     return [NSArray arrayWithObject:filename];
 }
 
+- (NSDragOperation)draggingEntered:(id <NSDraggingInfo>)sender
+{
+	return _private->isDragging ? NSDragOperationMove : NSDragOperationCopy;
+}
+
+- (NSDragOperation)draggingUpdated:(id <NSDraggingInfo>)sender
+{
+    NSPoint point = [self  convertPoint:[sender draggingLocation] fromView:nil];
+    NSDictionary *element = [self _elementAtPoint:point];
+    if ([[element objectForKey:WebElementIsEditableKey] boolValue] && [[self _bridge] moveCaretToPoint:point]) {
+        if (_private->isDragging) {
+            return [[element objectForKey:WebElementIsSelectedKey] boolValue] ? NSDragOperationNone : NSDragOperationMove;
+        } else {
+            return NSDragOperationCopy;
+        }
+    }
+    return NSDragOperationNone;
+}
+
+- (BOOL)prepareForDragOperation:(id <NSDraggingInfo>)sender
+{
+    return YES;
+}
+
+- (BOOL)performDragOperation:(id <NSDraggingInfo>)sender
+{
+    return YES;
+}
+
+- (void)concludeDragOperation:(id <NSDraggingInfo>)sender
+{
+    // FIXME: We should delete the original selection if we're doing a move.
+    [self _pasteHTMLFromPasteboard:[sender draggingPasteboard]];
+}
+
 - (void)mouseUp:(NSEvent *)event
 {
     [self _stopAutoscrollTimer];
diff --git a/WebKit/WebView.subproj/WebHTMLViewPrivate.h b/WebKit/WebView.subproj/WebHTMLViewPrivate.h
index e2bdf41..4d947d1 100644
--- a/WebKit/WebView.subproj/WebHTMLViewPrivate.h
+++ b/WebKit/WebView.subproj/WebHTMLViewPrivate.h
@@ -22,6 +22,7 @@
     BOOL inNextValidKeyView;
     BOOL ignoringMouseDraggedEvents;
     BOOL printing;
+    BOOL isDragging;
     
     id savedSubviews;
     BOOL subviewsSetAside;
@@ -73,6 +74,7 @@
 - (BOOL)_canDelete;
 - (BOOL)_canPaste;
 - (BOOL)_haveSelection;
+- (void)_pasteHTMLFromPasteboard:(NSPasteboard *)pasteboard;
 
 - (void)_frameOrBoundsChanged;
 
diff --git a/WebKit/WebView.subproj/WebImageView.m b/WebKit/WebView.subproj/WebImageView.m
index 60f9fbf..11e3d2c 100644
--- a/WebKit/WebView.subproj/WebImageView.m
+++ b/WebKit/WebView.subproj/WebImageView.m
@@ -238,6 +238,7 @@
                     rect:[self drawingRect]
                      URL:[rep URL]
                    title:nil
+              HTMLString:nil
                    event:event];
 }
 
diff --git a/WebKit/WebView.subproj/WebView.h b/WebKit/WebView.subproj/WebView.h
index 14f311e..2986406 100644
--- a/WebKit/WebView.subproj/WebView.h
+++ b/WebKit/WebView.subproj/WebView.h
@@ -20,11 +20,13 @@
 // the WebContextMenuDelegate's contextMenuItemsForElement and the WebwebViewPolicyDelegate's clickPolicyForElement.
 
 extern NSString *WebElementFrameKey;		// WebFrame of the element
+extern NSString *WebElementHTMLStringKey;   // NSString of the HTML representation of the element
 extern NSString *WebElementImageAltStringKey;	// NSString of the ALT attribute of the image element
 extern NSString *WebElementImageKey;		// NSImage of the image element
 extern NSString *WebElementImageRectKey;	// NSValue of an NSRect, the rect of the image element
 extern NSString *WebElementImageURLKey;		// NSURL of the image element
-extern NSString *WebElementIsSelectedKey; 	// NSNumber of BOOL indicating whether the element is selected text or not 
+extern NSString *WebElementIsEditableKey; 	// NSNumber of BOOL indicating whether the element is editable or not
+extern NSString *WebElementIsSelectedKey; 	// NSNumber of BOOL indicating whether the element is selected or not 
 extern NSString *WebElementLinkURLKey;		// NSURL of the link if the element is within an anchor
 extern NSString *WebElementLinkTargetFrameKey;	// NSString of the target of the anchor
 extern NSString *WebElementLinkTitleKey;	// NSString of the title of the anchor
diff --git a/WebKit/WebView.subproj/WebView.m b/WebKit/WebView.subproj/WebView.m
index 4bc1ddb..25de2da 100644
--- a/WebKit/WebView.subproj/WebView.m
+++ b/WebKit/WebView.subproj/WebView.m
@@ -63,16 +63,18 @@ static const struct UserAgentSpoofTableEntry *_web_findSpoofTableEntry(const cha
 #include "WebUserAgentSpoofTable.c"
 #undef __inline
 
-NSString *WebElementFrameKey = 			@"WebElementFrame";
-NSString *WebElementImageKey = 			@"WebElementImage";
-NSString *WebElementImageAltStringKey = 	@"WebElementImageAltString";
-NSString *WebElementImageRectKey = 		@"WebElementImageRect";
-NSString *WebElementImageURLKey = 		@"WebElementImageURL";
-NSString *WebElementIsSelectedKey = 	        @"WebElementIsSelected";
-NSString *WebElementLinkURLKey = 		@"WebElementLinkURL";
-NSString *WebElementLinkTargetFrameKey =	@"WebElementTargetFrame";
-NSString *WebElementLinkLabelKey = 		@"WebElementLinkLabel";
-NSString *WebElementLinkTitleKey = 		@"WebElementLinkTitle";
+NSString *WebElementFrameKey =              @"WebElementFrame";
+NSString *WebElementHTMLStringKey =         @"WebElementHTMLString";
+NSString *WebElementImageKey =              @"WebElementImage";
+NSString *WebElementImageAltStringKey =     @"WebElementImageAltString";
+NSString *WebElementImageRectKey =          @"WebElementImageRect";
+NSString *WebElementImageURLKey =           @"WebElementImageURL";
+NSString *WebElementIsEditableKey =         @"WebElementIsEditable";
+NSString *WebElementIsSelectedKey =         @"WebElementIsSelected";
+NSString *WebElementLinkURLKey =            @"WebElementLinkURL";
+NSString *WebElementLinkTargetFrameKey =    @"WebElementTargetFrame";
+NSString *WebElementLinkLabelKey =          @"WebElementLinkLabel";
+NSString *WebElementLinkTitleKey =          @"WebElementLinkTitle";
 
 NSString *WebViewProgressStartedNotification =          @"WebProgressStartedNotification";
 NSString *WebViewProgressEstimateChangedNotification =  @"WebProgressEstimateChangedNotification";

-- 
WebKit Debian packaging



More information about the Pkg-webkit-commits mailing list