18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2005, 2006 Apple Computer, Inc. All rights reserved. 38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Redistribution and use in source and binary forms, with or without 58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modification, are permitted provided that the following conditions 68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * are met: 78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 1. Redistributions of source code must retain the above copyright 98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * notice, this list of conditions and the following disclaimer. 108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright 118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * notice, this list of conditions and the following disclaimer in the 128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * documentation and/or other materials provided with the distribution. 138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of 148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * its contributors may be used to endorse or promote products derived 158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * from this software without specific prior written permission. 168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY 188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY 218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <WebKit/WebNSViewExtras.h> 308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <WebKit/DOMExtensions.h> 328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <WebKit/WebDataSource.h> 338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <WebKit/WebFramePrivate.h> 348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <WebKit/WebFrameViewInternal.h> 358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <WebKit/WebNSImageExtras.h> 368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <WebKit/WebNSPasteboardExtras.h> 378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <WebKit/WebNSURLExtras.h> 388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <WebKit/WebView.h> 398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define WebDragStartHysteresisX 5.0f 418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define WebDragStartHysteresisY 5.0f 428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define WebMaxDragImageSize NSMakeSize(400.0f, 400.0f) 438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define WebMaxOriginalImageArea (1500.0f * 1500.0f) 448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define WebDragIconRightInset 7.0f 458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define WebDragIconBottomInset 3.0f 468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@implementation NSView (WebExtras) 488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (NSView *)_web_superviewOfClass:(Class)class 508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSView *view = [self superview]; 528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project while (view && ![view isKindOfClass:class]) 538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project view = [view superview]; 548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return view; 558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (WebFrameView *)_web_parentWebFrameView 588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return (WebFrameView *)[self _web_superviewOfClass:[WebFrameView class]]; 608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// FIXME: Mail is the only client of _webView, remove this method once no versions of Mail need it. 638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (WebView *)_webView 648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return (WebView *)[self _web_superviewOfClass:[WebView class]]; 668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* Determine whether a mouse down should turn into a drag; started as copy of NSTableView code */ 698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (BOOL)_web_dragShouldBeginFromMouseDown:(NSEvent *)mouseDownEvent 708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project withExpiration:(NSDate *)expiration 718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project xHysteresis:(float)xHysteresis 728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project yHysteresis:(float)yHysteresis 738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSEvent *nextEvent, *firstEvent, *dragEvent, *mouseUp; 758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project BOOL dragIt; 768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ([mouseDownEvent type] != NSLeftMouseDown) { 788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return NO; 798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project nextEvent = nil; 828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project firstEvent = nil; 838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project dragEvent = nil; 848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project mouseUp = nil; 858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project dragIt = NO; 868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project while ((nextEvent = [[self window] nextEventMatchingMask:(NSLeftMouseUpMask | NSLeftMouseDraggedMask) 888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project untilDate:expiration 898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project inMode:NSEventTrackingRunLoopMode 908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project dequeue:YES]) != nil) { 918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (firstEvent == nil) { 928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project firstEvent = nextEvent; 938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ([nextEvent type] == NSLeftMouseDragged) { 968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project float deltax = ABS([nextEvent locationInWindow].x - [mouseDownEvent locationInWindow].x); 978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project float deltay = ABS([nextEvent locationInWindow].y - [mouseDownEvent locationInWindow].y); 988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project dragEvent = nextEvent; 998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (deltax >= xHysteresis) { 1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project dragIt = YES; 1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (deltay >= yHysteresis) { 1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project dragIt = YES; 1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } else if ([nextEvent type] == NSLeftMouseUp) { 1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project mouseUp = nextEvent; 1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Since we've been dequeuing the events (If we don't, we'll never see the mouse up...), 1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // we need to push some of the events back on. It makes sense to put the first and last 1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // drag events and the mouse up if there was one. 1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (mouseUp != nil) { 1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [NSApp postEvent:mouseUp atStart:YES]; 1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (dragEvent != nil) { 1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [NSApp postEvent:dragEvent atStart:YES]; 1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (firstEvent != mouseUp && firstEvent != dragEvent) { 1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [NSApp postEvent:firstEvent atStart:YES]; 1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return dragIt; 1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (BOOL)_web_dragShouldBeginFromMouseDown:(NSEvent *)mouseDownEvent 1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project withExpiration:(NSDate *)expiration 1338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return [self _web_dragShouldBeginFromMouseDown:mouseDownEvent 1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project withExpiration:expiration 1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project xHysteresis:WebDragStartHysteresisX 1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project yHysteresis:WebDragStartHysteresisY]; 1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (NSDragOperation)_web_dragOperationForDraggingInfo:(id <NSDraggingInfo>)sender 1428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (![NSApp modalWindow] && 1448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ![[self window] attachedSheet] && 1458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [sender draggingSource] != self && 1468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [[sender draggingPasteboard] _web_bestURL]) { 1478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return NSDragOperationCopy; 1498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return NSDragOperationNone; 1528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)_web_DragImageForElement:(DOMElement *)element 1558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project rect:(NSRect)rect 1568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project event:(NSEvent *)event 1578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project pasteboard:(NSPasteboard *)pasteboard 1588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project source:(id)source 1598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project offset:(NSPoint *)dragImageOffset 1608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSPoint mouseDownPoint = [self convertPoint:[event locationInWindow] fromView:nil]; 1628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSImage *dragImage; 1638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSPoint origin; 1648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSImage *image = [element image]; 1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (image != nil && [image size].height * [image size].width <= WebMaxOriginalImageArea) { 1678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSSize originalSize = rect.size; 1688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project origin = rect.origin; 1698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project dragImage = [[image copy] autorelease]; 1718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [dragImage setScalesWhenResized:YES]; 1728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [dragImage setSize:originalSize]; 1738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [dragImage _web_scaleToMaxSize:WebMaxDragImageSize]; 1758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSSize newSize = [dragImage size]; 1768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [dragImage _web_dissolveToFraction:WebDragImageAlpha]; 1788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Properly orient the drag image and orient it differently if it's smaller than the original 1808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project origin.x = mouseDownPoint.x - (((mouseDownPoint.x - origin.x) / originalSize.width) * newSize.width); 1818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project origin.y = origin.y + originalSize.height; 1828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project origin.y = mouseDownPoint.y - (((mouseDownPoint.y - origin.y) / originalSize.height) * newSize.height); 1838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } else { 1848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // FIXME: This has been broken for a while. 1858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // There's no way to get the MIME type for the image from a DOM element. 1868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // The old code used WKGetPreferredExtensionForMIMEType([image MIMEType]); 1878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSString *extension = @""; 1888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project dragImage = [[NSWorkspace sharedWorkspace] iconForFileType:extension]; 1898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSSize offset = NSMakeSize([dragImage size].width - WebDragIconRightInset, -WebDragIconBottomInset); 1908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project origin = NSMakePoint(mouseDownPoint.x - offset.width, mouseDownPoint.y - offset.height); 1918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // This is the offset from the lower left corner of the image to the mouse location. Because we 1948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // are a flipped view the calculation of Y is inverted. 1958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (dragImageOffset) { 1968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project dragImageOffset->x = mouseDownPoint.x - origin.x; 1978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project dragImageOffset->y = origin.y - mouseDownPoint.y; 1988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Per kwebster, offset arg is ignored 2018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [self dragImage:dragImage at:origin offset:NSZeroSize event:event pasteboard:pasteboard source:source slideBack:YES]; 2028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (BOOL)_web_firstResponderIsSelfOrDescendantView 2058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSResponder *responder = [[self window] firstResponder]; 2078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return (responder && 2088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project (responder == self || 2098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ([responder isKindOfClass:[NSView class]] && [(NSView *)responder isDescendantOf:self]))); 2108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (NSRect)_web_convertRect:(NSRect)aRect toView:(NSView *)aView 2138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Converting to this view's window; let -convertRect:toView: handle it 2158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (aView == nil) 2168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return [self convertRect:aRect toView:nil]; 2178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // This view must be in a window. Do whatever weird thing -convertRect:toView: does in this situation. 2198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSWindow *thisWindow = [self window]; 2208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!thisWindow) 2218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return [self convertRect:aRect toView:aView]; 2228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // The other view must be in a window, too. 2248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSWindow *otherWindow = [aView window]; 2258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!otherWindow) 2268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return [self convertRect:aRect toView:aView]; 2278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Convert to this window's coordinates 2298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSRect convertedRect = [self convertRect:aRect toView:nil]; 2308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Convert to screen coordinates 2328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project convertedRect.origin = [thisWindow convertBaseToScreen:convertedRect.origin]; 2338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Convert to other window's coordinates 2358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project convertedRect.origin = [otherWindow convertScreenToBase:convertedRect.origin]; 2368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Convert to other view's coordinates 2388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project convertedRect = [aView convertRect:convertedRect fromView:nil]; 2398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return convertedRect; 2418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@end 244