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