[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 06:27:47 UTC 2009


The following commit has been merged in the debian/unstable branch:
commit b2923f1323978ec8b76155212d72c80136765612
Author: cblu <cblu at 268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date:   Sat Jul 27 16:14:01 2002 +0000

    WebKit:
    
    	Implemented click policy, support for option-click
    	Implemented dragging of links and images from WebHTMLView
    
            * Misc.subproj/WebNSViewExtras.h:
            * Misc.subproj/WebNSViewExtras.m:
            (-[NSView _web_dragShouldBeginFromMouseDown:withExpiration:]): added, moved from WebBrowser
            (-[NSView _web_dragOperationForDraggingInfo:]): don't accept drag if source == destination
            * WebView.subproj/WebControllerPolicyHandler.h:
            * WebView.subproj/WebControllerPolicyHandler.m:
            (-[WebPolicy URL]): needed for click policy
            (+[WebURLPolicy webPolicyWithURLAction:]):
            (+[WebFileURLPolicy webPolicyWithFileAction:]):
            (+[WebContentPolicy webPolicyWithContentAction:andPath:]):
            * WebView.subproj/WebControllerPrivate.h:
            * WebView.subproj/WebControllerPrivate.m:
            (-[WebController _downloadURL:toPath:]): added, simply downloads a URL
            * WebView.subproj/WebDefaultContextMenuHandler.m:
            (-[WebDefaultContextMenuHandler downloadURL:]): calls [WebController _downloadURL:toPath:]
            * WebView.subproj/WebDefaultPolicyHandler.m:
            (-[WebDefaultPolicyHandler clickPolicyForElement:button:modifierMask:]):
            * WebView.subproj/WebHTMLView.m:
            (-[WebHTMLView mouseDown:]): calls _continueAfterCheckingDragForEvent
            (-[WebHTMLView mouseUp:]): calls _continueAfterClickPolicyForEvent
            (-[WebHTMLView draggingSourceOperationMaskForLocal:]): added
            (-[WebHTMLView namesOfPromisedFilesDroppedAtDestination:]): added, starts download
            * WebView.subproj/WebHTMLViewPrivate.h:
            * WebView.subproj/WebHTMLViewPrivate.m:
            (-[WebHTMLViewPrivate dealloc]):
            (-[WebHTMLView _elementAtPoint:]):
            (-[WebHTMLView _continueAfterClickPolicyForEvent:]): added, implements click policy
            (-[WebHTMLView _continueAfterCheckingDragForEvent:]): added, checks if mouse event is a drag
    
    WebBrowser:
    
    	Support for option-click.
    	Moved _web_dragShouldBeginFromMouseDown:withExpiration: to WebKit
    
            * BrowserWebController.m:
            (-[BrowserWebController clickPolicyForElement:button:modifierMask:]): support for option and command click
            * FavoriteButton.m:
            (-[FavoriteButton mouseDown:]): call _web_dragShouldBeginFromMouseDown:withExpiration:
            * LocationTextField.m:
            (-[LocationTextField mouseDown:]): call _web_dragShouldBeginFromMouseDown:withExpiration:
    
    
    git-svn-id: http://svn.webkit.org/repository/webkit/trunk@1686 268f45cc-cd09-0410-ab3c-d52691b4dbfc

diff --git a/WebKit/ChangeLog b/WebKit/ChangeLog
index ea98d5e..d994c4d 100644
--- a/WebKit/ChangeLog
+++ b/WebKit/ChangeLog
@@ -1,3 +1,37 @@
+2002-07-27  Chris Blumenberg  <cblu at apple.com>
+
+	Implemented click policy, support for option-click
+	Implemented dragging of links and images from WebHTMLView	
+
+        * Misc.subproj/WebNSViewExtras.h:
+        * Misc.subproj/WebNSViewExtras.m:
+        (-[NSView _web_dragShouldBeginFromMouseDown:withExpiration:]): added, moved from WebBrowser
+        (-[NSView _web_dragOperationForDraggingInfo:]): don't accept drag if source == destination
+        * WebView.subproj/WebControllerPolicyHandler.h:
+        * WebView.subproj/WebControllerPolicyHandler.m:
+        (-[WebPolicy URL]): needed for click policy
+        (+[WebURLPolicy webPolicyWithURLAction:]):
+        (+[WebFileURLPolicy webPolicyWithFileAction:]):
+        (+[WebContentPolicy webPolicyWithContentAction:andPath:]):
+        * WebView.subproj/WebControllerPrivate.h:
+        * WebView.subproj/WebControllerPrivate.m:
+        (-[WebController _downloadURL:toPath:]): added, simply downloads a URL
+        * WebView.subproj/WebDefaultContextMenuHandler.m:
+        (-[WebDefaultContextMenuHandler downloadURL:]): calls [WebController _downloadURL:toPath:]
+        * WebView.subproj/WebDefaultPolicyHandler.m:
+        (-[WebDefaultPolicyHandler clickPolicyForElement:button:modifierMask:]):
+        * WebView.subproj/WebHTMLView.m:
+        (-[WebHTMLView mouseDown:]): calls _continueAfterCheckingDragForEvent
+        (-[WebHTMLView mouseUp:]): calls _continueAfterClickPolicyForEvent
+        (-[WebHTMLView draggingSourceOperationMaskForLocal:]): added
+        (-[WebHTMLView namesOfPromisedFilesDroppedAtDestination:]): added, starts download
+        * WebView.subproj/WebHTMLViewPrivate.h:
+        * WebView.subproj/WebHTMLViewPrivate.m:
+        (-[WebHTMLViewPrivate dealloc]):
+        (-[WebHTMLView _elementAtPoint:]):
+        (-[WebHTMLView _continueAfterClickPolicyForEvent:]): added, implements click policy
+        (-[WebHTMLView _continueAfterCheckingDragForEvent:]): added, checks if mouse event is a drag
+
 2002-07-26  Richard Williamson  <rjw at apple.com>
 
         WebframeLoadType enum first value wasn't explicitly set, so 0 was used.  
diff --git a/WebKit/ChangeLog-2002-12-03 b/WebKit/ChangeLog-2002-12-03
index ea98d5e..d994c4d 100644
--- a/WebKit/ChangeLog-2002-12-03
+++ b/WebKit/ChangeLog-2002-12-03
@@ -1,3 +1,37 @@
+2002-07-27  Chris Blumenberg  <cblu at apple.com>
+
+	Implemented click policy, support for option-click
+	Implemented dragging of links and images from WebHTMLView	
+
+        * Misc.subproj/WebNSViewExtras.h:
+        * Misc.subproj/WebNSViewExtras.m:
+        (-[NSView _web_dragShouldBeginFromMouseDown:withExpiration:]): added, moved from WebBrowser
+        (-[NSView _web_dragOperationForDraggingInfo:]): don't accept drag if source == destination
+        * WebView.subproj/WebControllerPolicyHandler.h:
+        * WebView.subproj/WebControllerPolicyHandler.m:
+        (-[WebPolicy URL]): needed for click policy
+        (+[WebURLPolicy webPolicyWithURLAction:]):
+        (+[WebFileURLPolicy webPolicyWithFileAction:]):
+        (+[WebContentPolicy webPolicyWithContentAction:andPath:]):
+        * WebView.subproj/WebControllerPrivate.h:
+        * WebView.subproj/WebControllerPrivate.m:
+        (-[WebController _downloadURL:toPath:]): added, simply downloads a URL
+        * WebView.subproj/WebDefaultContextMenuHandler.m:
+        (-[WebDefaultContextMenuHandler downloadURL:]): calls [WebController _downloadURL:toPath:]
+        * WebView.subproj/WebDefaultPolicyHandler.m:
+        (-[WebDefaultPolicyHandler clickPolicyForElement:button:modifierMask:]):
+        * WebView.subproj/WebHTMLView.m:
+        (-[WebHTMLView mouseDown:]): calls _continueAfterCheckingDragForEvent
+        (-[WebHTMLView mouseUp:]): calls _continueAfterClickPolicyForEvent
+        (-[WebHTMLView draggingSourceOperationMaskForLocal:]): added
+        (-[WebHTMLView namesOfPromisedFilesDroppedAtDestination:]): added, starts download
+        * WebView.subproj/WebHTMLViewPrivate.h:
+        * WebView.subproj/WebHTMLViewPrivate.m:
+        (-[WebHTMLViewPrivate dealloc]):
+        (-[WebHTMLView _elementAtPoint:]):
+        (-[WebHTMLView _continueAfterClickPolicyForEvent:]): added, implements click policy
+        (-[WebHTMLView _continueAfterCheckingDragForEvent:]): added, checks if mouse event is a drag
+
 2002-07-26  Richard Williamson  <rjw at apple.com>
 
         WebframeLoadType enum first value wasn't explicitly set, so 0 was used.  
diff --git a/WebKit/Misc.subproj/WebNSViewExtras.h b/WebKit/Misc.subproj/WebNSViewExtras.h
index 6db9368..0ffbcc6 100644
--- a/WebKit/Misc.subproj/WebNSViewExtras.h
+++ b/WebKit/Misc.subproj/WebNSViewExtras.h
@@ -15,6 +15,8 @@
 // Returns the first WebView superview. Only works if self is the WebView's document view.
 - (WebView *)_web_parentWebView;
 
+- (BOOL)_web_dragShouldBeginFromMouseDown: (NSEvent *)mouseDownEvent withExpiration:(NSDate *)expiration;
+
 // FIXME: The following can be class methods
 
 // Returns an array with NSURLPboardType, NSStringPboardType and NSFilenamesPboardType pasteboard types
diff --git a/WebKit/Misc.subproj/WebNSViewExtras.m b/WebKit/Misc.subproj/WebNSViewExtras.m
index 0410fdf..e7685cf 100644
--- a/WebKit/Misc.subproj/WebNSViewExtras.m
+++ b/WebKit/Misc.subproj/WebNSViewExtras.m
@@ -10,6 +10,8 @@
 #import <WebFoundation/WebNSStringExtras.h>
 #import <WebFoundation/WebNSURLExtras.h>
 
+#define DragStartHysteresis  		5.0
+
 #ifdef DEBUG_VIEWS
 @interface NSObject (Foo)
 - (void*)_renderFramePart;
@@ -43,6 +45,66 @@
     return nil;
 }
 
+/* Determine whether a mouse down should turn into a drag; started as copy of NSTableView code */
+- (BOOL)_web_dragShouldBeginFromMouseDown: (NSEvent *)mouseDownEvent withExpiration:(NSDate *)expiration
+{
+    NSEvent *nextEvent, *firstEvent, *dragEvent, *mouseUp;
+    BOOL dragIt;
+
+    if ([mouseDownEvent type] != NSLeftMouseDown) {
+        return NO;
+    }
+
+    nextEvent = nil;
+    firstEvent = nil;
+    dragEvent = nil;
+    mouseUp = nil;
+    dragIt = NO;
+
+    while ((nextEvent = [[self window] nextEventMatchingMask:(NSLeftMouseUpMask | NSLeftMouseDraggedMask)
+                                                   untilDate:expiration
+                                                      inMode:NSEventTrackingRunLoopMode
+                                                     dequeue:YES]) != nil) {
+        if (firstEvent == nil) {
+            firstEvent = nextEvent;
+        }
+
+        if ([nextEvent type] == NSLeftMouseDragged) {
+            float deltax = ABS([nextEvent locationInWindow].x - [mouseDownEvent locationInWindow].x);
+            float deltay = ABS([nextEvent locationInWindow].y - [mouseDownEvent locationInWindow].y);
+            dragEvent = nextEvent;
+
+            if (deltax >= DragStartHysteresis) {
+                dragIt = YES;
+                break;
+            }
+
+            if (deltay >= DragStartHysteresis) {
+                dragIt = YES;
+                break;
+            }
+        } else if ([nextEvent type] == NSLeftMouseUp) {
+            mouseUp = nextEvent;
+            break;
+        }
+    }
+
+    // Since we've been dequeuing the events (If we don't, we'll never see the mouse up...),
+    // we need to push some of the events back on.  It makes sense to put the first and last
+    // drag events and the mouse up if there was one.
+    if (mouseUp != nil) {
+        [NSApp postEvent: mouseUp atStart: YES];
+    }
+    if (dragEvent != nil) {
+        [NSApp postEvent: dragEvent atStart: YES];
+    }
+    if (firstEvent != mouseUp && firstEvent != dragEvent) {
+        [NSApp postEvent: firstEvent atStart: YES];
+    }
+
+    return dragIt;
+}
+
 - (NSArray *)_web_acceptableDragTypes
 {
     return [NSArray arrayWithObjects:NSURLPboardType, NSStringPboardType, NSFilenamesPboardType, nil];
@@ -77,7 +139,7 @@
 
 - (NSDragOperation)_web_dragOperationForDraggingInfo:(id <NSDraggingInfo>)sender
 {
-    if([self _web_bestURLForDraggingInfo:sender]){
+    if([self _web_bestURLForDraggingInfo:sender] && [sender draggingSource] != self){
         return NSDragOperationCopy;
     } else {
         return NSDragOperationNone;
diff --git a/WebKit/WebView.subproj/WebControllerPolicyDelegate.h b/WebKit/WebView.subproj/WebControllerPolicyDelegate.h
index 3621285..6b4ef14 100644
--- a/WebKit/WebView.subproj/WebControllerPolicyDelegate.h
+++ b/WebKit/WebView.subproj/WebControllerPolicyDelegate.h
@@ -18,6 +18,7 @@ typedef enum {
     WebPolicySave,
     WebPolicyOpenURL,
     WebPolicySaveAndOpen,
+    WebPolicyOpenNewWindow,
     WebPolicyIgnore
 } WebPolicyAction;
 
@@ -43,8 +44,8 @@ typedef enum {
 } WebContentAction;
 
 typedef enum {
-    WebClickPolicyNone = WebPolicyNone,
     WebClickPolicyShow = WebPolicyUse,
+    WebClickPolicyOpenNewWindow = WebPolicyOpenNewWindow,
     WebClickPolicySave = WebPolicySave,
     WebClickPolicySaveAndOpenExternally = WebPolicySaveAndOpen,
     WebClickPolicyIgnore = WebPolicyIgnore
@@ -58,6 +59,7 @@ typedef enum {
 }
 - (WebPolicyAction)policyAction;
 - (NSString *)path;
+- (NSURL *)URL;
 @end
 
 
@@ -74,7 +76,7 @@ typedef enum {
 @end
 
 @interface WebClickPolicy : WebPolicy
-+ webPolicyWithClickAction: (WebClickAction)action andPath: (NSString *)thePath;
++ webPolicyWithClickAction: (WebClickAction)action URL:(NSURL *)URL andPath: (NSString *)thePath;
 @end
 
 
diff --git a/WebKit/WebView.subproj/WebControllerPolicyHandler.h b/WebKit/WebView.subproj/WebControllerPolicyHandler.h
index 3621285..6b4ef14 100644
--- a/WebKit/WebView.subproj/WebControllerPolicyHandler.h
+++ b/WebKit/WebView.subproj/WebControllerPolicyHandler.h
@@ -18,6 +18,7 @@ typedef enum {
     WebPolicySave,
     WebPolicyOpenURL,
     WebPolicySaveAndOpen,
+    WebPolicyOpenNewWindow,
     WebPolicyIgnore
 } WebPolicyAction;
 
@@ -43,8 +44,8 @@ typedef enum {
 } WebContentAction;
 
 typedef enum {
-    WebClickPolicyNone = WebPolicyNone,
     WebClickPolicyShow = WebPolicyUse,
+    WebClickPolicyOpenNewWindow = WebPolicyOpenNewWindow,
     WebClickPolicySave = WebPolicySave,
     WebClickPolicySaveAndOpenExternally = WebPolicySaveAndOpen,
     WebClickPolicyIgnore = WebPolicyIgnore
@@ -58,6 +59,7 @@ typedef enum {
 }
 - (WebPolicyAction)policyAction;
 - (NSString *)path;
+- (NSURL *)URL;
 @end
 
 
@@ -74,7 +76,7 @@ typedef enum {
 @end
 
 @interface WebClickPolicy : WebPolicy
-+ webPolicyWithClickAction: (WebClickAction)action andPath: (NSString *)thePath;
++ webPolicyWithClickAction: (WebClickAction)action URL:(NSURL *)URL andPath: (NSString *)thePath;
 @end
 
 
diff --git a/WebKit/WebView.subproj/WebControllerPolicyHandler.m b/WebKit/WebView.subproj/WebControllerPolicyHandler.m
index 01a2216..1d235fe 100644
--- a/WebKit/WebView.subproj/WebControllerPolicyHandler.m
+++ b/WebKit/WebView.subproj/WebControllerPolicyHandler.m
@@ -13,6 +13,7 @@
 @public
     WebPolicyAction policyAction;
     NSString *path;
+    NSURL *URL;
 }
 @end
 
@@ -26,12 +27,13 @@
 @end
 
 @implementation WebPolicy
-- initWithPolicyAction: (WebPolicyAction)action andPath:(NSString *)path;
+- initWithPolicyAction: (WebPolicyAction)action URL:(NSURL *)URL andPath:(NSString *)path;
 {
     [super init];
     _private = [[WebPolicyPrivate alloc] init];
     _private->policyAction = action;
     _private->path = [path retain];
+    _private->URL = [URL retain];
     return self;
 }
 
@@ -50,6 +52,11 @@
     return _private->path;
 }
 
+- (NSURL *)URL
+{
+    return _private->URL;
+}
+
 - (void)_setPath:(NSString *)path
 {
     [_private->path release];
@@ -69,7 +76,7 @@
 
 + webPolicyWithURLAction: (WebURLAction)action
 {
-    return [[[WebPolicy alloc] initWithPolicyAction:action andPath:nil] autorelease];
+    return [[[WebPolicy alloc] initWithPolicyAction:action URL:nil andPath:nil] autorelease];
 }
 
 @end
@@ -78,7 +85,7 @@
 
 + webPolicyWithFileAction: (WebFileAction)action
 {
-    return [[[WebPolicy alloc] initWithPolicyAction:action andPath:nil] autorelease];
+    return [[[WebPolicy alloc] initWithPolicyAction:action URL:nil andPath:nil] autorelease];
 }
 
 @end
@@ -87,7 +94,7 @@
 
 + webPolicyWithContentAction: (WebContentAction)action andPath: (NSString *)thePath
 {
-    return [[[WebPolicy alloc] initWithPolicyAction:action andPath:thePath] autorelease];
+    return [[[WebPolicy alloc] initWithPolicyAction:action URL:nil andPath:thePath] autorelease];
 }
 
 
@@ -95,9 +102,9 @@
 
 @implementation WebClickPolicy
 
-+ webPolicyWithClickAction: (WebClickAction)action andPath: (NSString *)thePath
++ webPolicyWithClickAction: (WebClickAction)action URL:(NSURL *)URL andPath: (NSString *)thePath;
 {
-    return [[[WebPolicy alloc] initWithPolicyAction:action andPath:thePath] autorelease];
+    return [[[WebPolicy alloc] initWithPolicyAction:action URL:URL andPath:thePath] autorelease];
 }
 
 
diff --git a/WebKit/WebView.subproj/WebControllerPrivate.h b/WebKit/WebView.subproj/WebControllerPrivate.h
index 414372f..c3c99f6 100644
--- a/WebKit/WebView.subproj/WebControllerPrivate.h
+++ b/WebKit/WebView.subproj/WebControllerPrivate.h
@@ -36,4 +36,5 @@
 + (NSString *)_MIMETypeForFile: (NSString *)path;
 - (BOOL)_openedByScript;
 - (void)_setOpenedByScript:(BOOL)openedByScript;
+- (void)_downloadURL:(NSURL *)URL toPath:(NSString *)path;
 @end
diff --git a/WebKit/WebView.subproj/WebControllerPrivate.m b/WebKit/WebView.subproj/WebControllerPrivate.m
index 88b87a3..977aa0d 100644
--- a/WebKit/WebView.subproj/WebControllerPrivate.m
+++ b/WebKit/WebView.subproj/WebControllerPrivate.m
@@ -5,6 +5,7 @@
 
 #import <WebKit/WebBackForwardList.h>
 #import <WebKit/WebControllerPrivate.h>
+#import <WebKit/WebControllerPolicyHandlerPrivate.h>
 #import <WebKit/WebDataSourcePrivate.h>
 #import <WebKit/WebDefaultContextMenuHandler.h>
 #import <WebKit/WebFramePrivate.h>
@@ -179,5 +180,17 @@
     _private->openedByScript = openedByScript;
 }
 
+- (void)_downloadURL:(NSURL *)URL toPath:(NSString *)path
+{
+    WebDataSource *dataSource = [[WebDataSource alloc] initWithURL:URL];
+    WebFrame *webFrame = [self mainFrame];
+        
+    WebContentPolicy *contentPolicy = [WebContentPolicy webPolicyWithContentAction:WebContentPolicySave andPath:path];
+    [dataSource _setContentPolicy:contentPolicy];
+    if([webFrame setProvisionalDataSource:dataSource]){
+        [webFrame startLoading];
+    }
+    [dataSource release];
+}
 
 @end
diff --git a/WebKit/WebView.subproj/WebDefaultContextMenuDelegate.m b/WebKit/WebView.subproj/WebDefaultContextMenuDelegate.m
index 095e1f5..087fbb0 100644
--- a/WebKit/WebView.subproj/WebDefaultContextMenuDelegate.m
+++ b/WebKit/WebView.subproj/WebDefaultContextMenuDelegate.m
@@ -10,7 +10,7 @@
 #import <WebKit/WebDataSourcePrivate.h>
 #import <WebKit/WebDefaultContextMenuHandler.h>
 #import <WebKit/WebControllerPolicyHandler.h>
-#import <WebKit/WebControllerPolicyHandlerPrivate.h>
+#import <WebKit/WebControllerPrivate.h>
 #import <WebKit/WebFrame.h>
 
 @implementation WebDefaultContextMenuHandler
@@ -105,12 +105,7 @@
 
     // FIXME: This is a hack
     WebContentPolicy *contentPolicy = [[controller policyHandler] contentPolicyForMIMEType:@"application/octet-stream" dataSource:dataSource];
-    [contentPolicy _setPolicyAction:WebContentPolicySave];
-    [dataSource _setContentPolicy:contentPolicy];
-    if([webFrame setProvisionalDataSource:dataSource]){
-        [webFrame startLoading];
-    }
-    [dataSource release];
+    [controller _downloadURL:URL toPath:[contentPolicy path]];
 }
 
 - (void)openLinkInNewWindow:(id)sender
diff --git a/WebKit/WebView.subproj/WebDefaultContextMenuHandler.m b/WebKit/WebView.subproj/WebDefaultContextMenuHandler.m
index 095e1f5..087fbb0 100644
--- a/WebKit/WebView.subproj/WebDefaultContextMenuHandler.m
+++ b/WebKit/WebView.subproj/WebDefaultContextMenuHandler.m
@@ -10,7 +10,7 @@
 #import <WebKit/WebDataSourcePrivate.h>
 #import <WebKit/WebDefaultContextMenuHandler.h>
 #import <WebKit/WebControllerPolicyHandler.h>
-#import <WebKit/WebControllerPolicyHandlerPrivate.h>
+#import <WebKit/WebControllerPrivate.h>
 #import <WebKit/WebFrame.h>
 
 @implementation WebDefaultContextMenuHandler
@@ -105,12 +105,7 @@
 
     // FIXME: This is a hack
     WebContentPolicy *contentPolicy = [[controller policyHandler] contentPolicyForMIMEType:@"application/octet-stream" dataSource:dataSource];
-    [contentPolicy _setPolicyAction:WebContentPolicySave];
-    [dataSource _setContentPolicy:contentPolicy];
-    if([webFrame setProvisionalDataSource:dataSource]){
-        [webFrame startLoading];
-    }
-    [dataSource release];
+    [controller _downloadURL:URL toPath:[contentPolicy path]];
 }
 
 - (void)openLinkInNewWindow:(id)sender
diff --git a/WebKit/WebView.subproj/WebDefaultPolicyDelegate.m b/WebKit/WebView.subproj/WebDefaultPolicyDelegate.m
index cc262e6..a568c9e 100644
--- a/WebKit/WebView.subproj/WebDefaultPolicyDelegate.m
+++ b/WebKit/WebView.subproj/WebDefaultPolicyDelegate.m
@@ -65,7 +65,7 @@
 
 - (WebClickPolicy *)clickPolicyForElement: (NSDictionary *)elementInformation button: (NSEventType)eventType modifierMask: (unsigned int)eventMask
 {
-    return [WebClickPolicy webPolicyWithClickAction:WebClickPolicyShow andPath:nil];
+    return [WebClickPolicy webPolicyWithClickAction:WebClickPolicyShow URL:nil andPath:nil];
 }
 
 @end
diff --git a/WebKit/WebView.subproj/WebDefaultPolicyHandler.m b/WebKit/WebView.subproj/WebDefaultPolicyHandler.m
index cc262e6..a568c9e 100644
--- a/WebKit/WebView.subproj/WebDefaultPolicyHandler.m
+++ b/WebKit/WebView.subproj/WebDefaultPolicyHandler.m
@@ -65,7 +65,7 @@
 
 - (WebClickPolicy *)clickPolicyForElement: (NSDictionary *)elementInformation button: (NSEventType)eventType modifierMask: (unsigned int)eventMask
 {
-    return [WebClickPolicy webPolicyWithClickAction:WebClickPolicyShow andPath:nil];
+    return [WebClickPolicy webPolicyWithClickAction:WebClickPolicyShow URL:nil andPath:nil];
 }
 
 @end
diff --git a/WebKit/WebView.subproj/WebHTMLView.m b/WebKit/WebView.subproj/WebHTMLView.m
index fce404a..bcb9ca5 100644
--- a/WebKit/WebView.subproj/WebHTMLView.m
+++ b/WebKit/WebView.subproj/WebHTMLView.m
@@ -351,28 +351,45 @@
     return YES;
 }
 
-
 - (void)windowDidBecomeMain: (NSNotification *)notification
 {
     if ([notification object] == [self window])
         [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(mouseMovedNotification:) name: NSMouseMovedNotification object: nil];
 }
 
-
 - (void)windowDidResignMain: (NSNotification *)notification
 {
     if ([notification object] == [self window])
         [[NSNotificationCenter defaultCenter] removeObserver: self name: NSMouseMovedNotification object: nil];
 }
 
-- (void)mouseUp: (NSEvent *)event
+- (void)mouseDown: (NSEvent *)event
 {
-    [[self _bridge] mouseUp:event];
+    if([self _continueAfterCheckingDragForEvent:event]){
+        [[self _bridge] mouseDown:event];
+    }
 }
 
-- (void)mouseDown: (NSEvent *)event
+- (void)mouseUp: (NSEvent *)event
 {
-    [[self _bridge] mouseDown:event];
+    NSEvent *theEvent;
+    
+    if([self _continueAfterClickPolicyForEvent:event]){
+        theEvent = event;
+    }else{
+        // Send a bogus mouse up event so we don't confuse WebCore
+        theEvent = [NSEvent mouseEventWithType: NSLeftMouseUp
+                                      location: NSMakePoint(0,0)
+                                 modifierFlags: [event modifierFlags]
+                                     timestamp: [event timestamp]
+                                  windowNumber: [event windowNumber]
+                                       context: [event context]
+                                   eventNumber: [event eventNumber]
+                                    clickCount: [event clickCount]
+                                      pressure: [event pressure]];
+    }
+    
+    [[self _bridge] mouseUp:theEvent];
 }
 
 - (void)mouseMovedNotification:(NSNotification *)notification
@@ -447,4 +464,18 @@
 
 #endif
 
+- (unsigned int)draggingSourceOperationMaskForLocal:(BOOL)isLocal
+{
+    return NSDragOperationCopy;
+}
+
+- (NSArray *)namesOfPromisedFilesDroppedAtDestination:(NSURL *)dropDestination
+{
+    NSString *filename = [[_private->draggedURL path] lastPathComponent];
+    NSString *path = [[dropDestination path] stringByAppendingPathComponent:filename];
+
+    [[self _controller] _downloadURL:_private->draggedURL toPath:path];
+    return [NSArray arrayWithObject:filename];
+}
+
 @end
diff --git a/WebKit/WebView.subproj/WebHTMLViewPrivate.h b/WebKit/WebView.subproj/WebHTMLViewPrivate.h
index 3a19b33..9e81126 100644
--- a/WebKit/WebView.subproj/WebHTMLViewPrivate.h
+++ b/WebKit/WebView.subproj/WebHTMLViewPrivate.h
@@ -22,6 +22,7 @@
     NSCursor *cursor;
     BOOL liveAllowsScrolling;
     BOOL inWindow;
+    NSURL *draggedURL;
 }
 @end
 
@@ -37,4 +38,6 @@
 + (BOOL)_modifierTrackingEnabled;
 + (void)_postFlagsChangedEvent:(NSEvent *)flagsChangedEvent;
 - (NSDictionary *)_elementAtPoint:(NSPoint)point;
+- (BOOL)_continueAfterClickPolicyForEvent: (NSEvent *)event;
+- (BOOL)_continueAfterCheckingDragForEvent:(NSEvent *)event;
 @end
diff --git a/WebKit/WebView.subproj/WebHTMLViewPrivate.m b/WebKit/WebView.subproj/WebHTMLViewPrivate.m
index 89b72df..d7f8a79 100644
--- a/WebKit/WebView.subproj/WebHTMLViewPrivate.m
+++ b/WebKit/WebView.subproj/WebHTMLViewPrivate.m
@@ -14,6 +14,7 @@
 #import <WebKit/WebNSViewExtras.h>
 #import <WebKit/WebPluginView.h>
 #import <WebKit/WebController.h>
+#import <WebKit/WebControllerPrivate.h>
 #import <WebKit/WebBridge.h>
 #import <WebKit/WebFramePrivate.h>
 #import <WebKit/WebViewPrivate.h>
@@ -38,7 +39,7 @@
 - (void)dealloc
 {
     [cursor release];
-
+    [draggedURL release];
     [super dealloc];
 }
 
@@ -127,4 +128,64 @@ BOOL _modifierTrackingEnabled = FALSE;
     return elementInfo;
 }
 
+- (BOOL)_continueAfterClickPolicyForEvent: (NSEvent *)event
+{
+    NSPoint point = [self convertPoint:[event locationInWindow] fromView:nil];
+    WebController *controller = [self _controller];
+    WebClickPolicy *clickPolicy;
+
+    clickPolicy = [[controller policyHandler] clickPolicyForElement:[self _elementAtPoint:point]
+                                                             button:[event type]
+                                                       modifierMask:[event modifierFlags]];
+
+    WebPolicyAction clickAction = [clickPolicy policyAction];
+    NSURL *URL = [clickPolicy URL];
+
+    switch (clickAction) {
+        case WebClickPolicyShow:
+            return YES;
+        case WebClickPolicyOpenNewWindow:
+            [[controller windowContext] openNewWindowWithURL:URL];
+            break;
+        case WebClickPolicySave:
+        case WebClickPolicySaveAndOpenExternally:
+            [controller _downloadURL:URL toPath:[clickPolicy path]];
+            break;
+        case WebClickPolicyIgnore:
+            break;
+        default:
+            [NSException raise:NSInvalidArgumentException
+                        format:@"clickPolicyForElement:button:modifierMask: returned an invalid WebClickPolicy"];
+    }
+    return NO;
+}
+
+- (BOOL)_continueAfterCheckingDragForEvent:(NSEvent *)event
+{
+    if([self _web_dragShouldBeginFromMouseDown:event withExpiration:[NSDate distantFuture]]){
+
+        NSPoint point = [self convertPoint:[event locationInWindow] fromView:nil];
+        NSDictionary *element = [self _elementAtPoint:point];
+        NSURL *imageURL = [element objectForKey:WebContextImageURL];
+        NSURL *linkURL = [element objectForKey:WebContextLinkURL];
+
+        if(linkURL || imageURL){
+            [_private->draggedURL release];
+            
+            if(imageURL){
+                _private->draggedURL = imageURL;
+            }else{
+                _private->draggedURL = linkURL;
+            }
+            
+            [_private->draggedURL retain];
+            NSArray *fileType = [NSArray arrayWithObject:[[_private->draggedURL path] pathExtension]];
+            NSRect rect = NSMakeRect(point.x+-16, point.y-16, 32, 32);
+            [self dragPromisedFilesOfTypes:fileType fromRect:rect source:self slideBack:YES event:event];
+            return NO;
+        }
+    }
+    return YES;
+}
+
 @end
diff --git a/WebKit/WebView.subproj/WebPolicyDelegate.h b/WebKit/WebView.subproj/WebPolicyDelegate.h
index 3621285..6b4ef14 100644
--- a/WebKit/WebView.subproj/WebPolicyDelegate.h
+++ b/WebKit/WebView.subproj/WebPolicyDelegate.h
@@ -18,6 +18,7 @@ typedef enum {
     WebPolicySave,
     WebPolicyOpenURL,
     WebPolicySaveAndOpen,
+    WebPolicyOpenNewWindow,
     WebPolicyIgnore
 } WebPolicyAction;
 
@@ -43,8 +44,8 @@ typedef enum {
 } WebContentAction;
 
 typedef enum {
-    WebClickPolicyNone = WebPolicyNone,
     WebClickPolicyShow = WebPolicyUse,
+    WebClickPolicyOpenNewWindow = WebPolicyOpenNewWindow,
     WebClickPolicySave = WebPolicySave,
     WebClickPolicySaveAndOpenExternally = WebPolicySaveAndOpen,
     WebClickPolicyIgnore = WebPolicyIgnore
@@ -58,6 +59,7 @@ typedef enum {
 }
 - (WebPolicyAction)policyAction;
 - (NSString *)path;
+- (NSURL *)URL;
 @end
 
 
@@ -74,7 +76,7 @@ typedef enum {
 @end
 
 @interface WebClickPolicy : WebPolicy
-+ webPolicyWithClickAction: (WebClickAction)action andPath: (NSString *)thePath;
++ webPolicyWithClickAction: (WebClickAction)action URL:(NSURL *)URL andPath: (NSString *)thePath;
 @end
 
 
diff --git a/WebKit/WebView.subproj/WebViewPrivate.h b/WebKit/WebView.subproj/WebViewPrivate.h
index 414372f..c3c99f6 100644
--- a/WebKit/WebView.subproj/WebViewPrivate.h
+++ b/WebKit/WebView.subproj/WebViewPrivate.h
@@ -36,4 +36,5 @@
 + (NSString *)_MIMETypeForFile: (NSString *)path;
 - (BOOL)_openedByScript;
 - (void)_setOpenedByScript:(BOOL)openedByScript;
+- (void)_downloadURL:(NSURL *)URL toPath:(NSString *)path;
 @end
diff --git a/WebKit/WebView.subproj/WebViewPrivate.m b/WebKit/WebView.subproj/WebViewPrivate.m
index 88b87a3..977aa0d 100644
--- a/WebKit/WebView.subproj/WebViewPrivate.m
+++ b/WebKit/WebView.subproj/WebViewPrivate.m
@@ -5,6 +5,7 @@
 
 #import <WebKit/WebBackForwardList.h>
 #import <WebKit/WebControllerPrivate.h>
+#import <WebKit/WebControllerPolicyHandlerPrivate.h>
 #import <WebKit/WebDataSourcePrivate.h>
 #import <WebKit/WebDefaultContextMenuHandler.h>
 #import <WebKit/WebFramePrivate.h>
@@ -179,5 +180,17 @@
     _private->openedByScript = openedByScript;
 }
 
+- (void)_downloadURL:(NSURL *)URL toPath:(NSString *)path
+{
+    WebDataSource *dataSource = [[WebDataSource alloc] initWithURL:URL];
+    WebFrame *webFrame = [self mainFrame];
+        
+    WebContentPolicy *contentPolicy = [WebContentPolicy webPolicyWithContentAction:WebContentPolicySave andPath:path];
+    [dataSource _setContentPolicy:contentPolicy];
+    if([webFrame setProvisionalDataSource:dataSource]){
+        [webFrame startLoading];
+    }
+    [dataSource release];
+}
 
 @end

-- 
WebKit Debian packaging



More information about the Pkg-webkit-commits mailing list