Index: chrome/browser/ui/cocoa/web_drop_target.mm |
=================================================================== |
--- chrome/browser/ui/cocoa/web_drop_target.mm (revision 71953) |
+++ chrome/browser/ui/cocoa/web_drop_target.mm (working copy) |
@@ -1,283 +0,0 @@ |
-// Copyright (c) 2010 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#import "chrome/browser/ui/cocoa/web_drop_target.h" |
- |
-#include "base/sys_string_conversions.h" |
-#include "chrome/browser/bookmarks/bookmark_node_data.h" |
-#include "chrome/browser/bookmarks/bookmark_pasteboard_helper_mac.h" |
-#include "chrome/browser/renderer_host/render_view_host.h" |
-#include "chrome/browser/tab_contents/tab_contents.h" |
-#import "third_party/mozilla/NSPasteboard+Utils.h" |
-#include "webkit/glue/webdropdata.h" |
-#include "webkit/glue/window_open_disposition.h" |
- |
-using WebKit::WebDragOperationsMask; |
- |
-@implementation WebDropTarget |
- |
-// |contents| is the TabContents representing this tab, used to communicate |
-// drag&drop messages to WebCore and handle navigation on a successful drop |
-// (if necessary). |
-- (id)initWithTabContents:(TabContents*)contents { |
- if ((self = [super init])) { |
- tabContents_ = contents; |
- } |
- return self; |
-} |
- |
-// Call to set whether or not we should allow the drop. Takes effect the |
-// next time |-draggingUpdated:| is called. |
-- (void)setCurrentOperation: (NSDragOperation)operation { |
- current_operation_ = operation; |
-} |
- |
-// Given a point in window coordinates and a view in that window, return a |
-// flipped point in the coordinate system of |view|. |
-- (NSPoint)flipWindowPointToView:(const NSPoint&)windowPoint |
- view:(NSView*)view { |
- DCHECK(view); |
- NSPoint viewPoint = [view convertPoint:windowPoint fromView:nil]; |
- NSRect viewFrame = [view frame]; |
- viewPoint.y = viewFrame.size.height - viewPoint.y; |
- return viewPoint; |
-} |
- |
-// Given a point in window coordinates and a view in that window, return a |
-// flipped point in screen coordinates. |
-- (NSPoint)flipWindowPointToScreen:(const NSPoint&)windowPoint |
- view:(NSView*)view { |
- DCHECK(view); |
- NSPoint screenPoint = [[view window] convertBaseToScreen:windowPoint]; |
- NSScreen* screen = [[view window] screen]; |
- NSRect screenFrame = [screen frame]; |
- screenPoint.y = screenFrame.size.height - screenPoint.y; |
- return screenPoint; |
-} |
- |
-// Return YES if the drop site only allows drops that would navigate. If this |
-// is the case, we don't want to pass messages to the renderer because there's |
-// really no point (i.e., there's nothing that cares about the mouse position or |
-// entering and exiting). One example is an interstitial page (e.g., safe |
-// browsing warning). |
-- (BOOL)onlyAllowsNavigation { |
- return tabContents_->showing_interstitial_page(); |
-} |
- |
-// Messages to send during the tracking of a drag, ususally upon recieving |
-// calls from the view system. Communicates the drag messages to WebCore. |
- |
-- (NSDragOperation)draggingEntered:(id<NSDraggingInfo>)info |
- view:(NSView*)view { |
- // Save off the RVH so we can tell if it changes during a drag. If it does, |
- // we need to send a new enter message in draggingUpdated:. |
- currentRVH_ = tabContents_->render_view_host(); |
- |
- if ([self onlyAllowsNavigation]) { |
- if ([[info draggingPasteboard] containsURLData]) |
- return NSDragOperationCopy; |
- return NSDragOperationNone; |
- } |
- |
- // If the tab is showing the boomark manager, send BookmarkDrag events |
- RenderViewHostDelegate::BookmarkDrag* dragDelegate = |
- tabContents_->GetBookmarkDragDelegate(); |
- BookmarkNodeData dragData; |
- if(dragDelegate && dragData.ReadFromDragClipboard()) |
- dragDelegate->OnDragEnter(dragData); |
- |
- // Fill out a WebDropData from pasteboard. |
- WebDropData data; |
- [self populateWebDropData:&data fromPasteboard:[info draggingPasteboard]]; |
- |
- // Create the appropriate mouse locations for WebCore. The draggingLocation |
- // is in window coordinates. Both need to be flipped. |
- NSPoint windowPoint = [info draggingLocation]; |
- NSPoint viewPoint = [self flipWindowPointToView:windowPoint view:view]; |
- NSPoint screenPoint = [self flipWindowPointToScreen:windowPoint view:view]; |
- NSDragOperation mask = [info draggingSourceOperationMask]; |
- tabContents_->render_view_host()->DragTargetDragEnter(data, |
- gfx::Point(viewPoint.x, viewPoint.y), |
- gfx::Point(screenPoint.x, screenPoint.y), |
- static_cast<WebDragOperationsMask>(mask)); |
- |
- // We won't know the true operation (whether the drag is allowed) until we |
- // hear back from the renderer. For now, be optimistic: |
- current_operation_ = NSDragOperationCopy; |
- return current_operation_; |
-} |
- |
-- (void)draggingExited:(id<NSDraggingInfo>)info { |
- DCHECK(currentRVH_); |
- if (currentRVH_ != tabContents_->render_view_host()) |
- return; |
- |
- // Nothing to do in the interstitial case. |
- |
- tabContents_->render_view_host()->DragTargetDragLeave(); |
-} |
- |
-- (NSDragOperation)draggingUpdated:(id<NSDraggingInfo>)info |
- view:(NSView*)view { |
- DCHECK(currentRVH_); |
- if (currentRVH_ != tabContents_->render_view_host()) |
- [self draggingEntered:info view:view]; |
- |
- if ([self onlyAllowsNavigation]) { |
- if ([[info draggingPasteboard] containsURLData]) |
- return NSDragOperationCopy; |
- return NSDragOperationNone; |
- } |
- |
- // Create the appropriate mouse locations for WebCore. The draggingLocation |
- // is in window coordinates. |
- NSPoint windowPoint = [info draggingLocation]; |
- NSPoint viewPoint = [self flipWindowPointToView:windowPoint view:view]; |
- NSPoint screenPoint = [self flipWindowPointToScreen:windowPoint view:view]; |
- NSDragOperation mask = [info draggingSourceOperationMask]; |
- tabContents_->render_view_host()->DragTargetDragOver( |
- gfx::Point(viewPoint.x, viewPoint.y), |
- gfx::Point(screenPoint.x, screenPoint.y), |
- static_cast<WebDragOperationsMask>(mask)); |
- |
- // If the tab is showing the boomark manager, send BookmarkDrag events |
- RenderViewHostDelegate::BookmarkDrag* dragDelegate = |
- tabContents_->GetBookmarkDragDelegate(); |
- BookmarkNodeData dragData; |
- if(dragDelegate && dragData.ReadFromDragClipboard()) |
- dragDelegate->OnDragOver(dragData); |
- return current_operation_; |
-} |
- |
-- (BOOL)performDragOperation:(id<NSDraggingInfo>)info |
- view:(NSView*)view { |
- if (currentRVH_ != tabContents_->render_view_host()) |
- [self draggingEntered:info view:view]; |
- |
- // Check if we only allow navigation and navigate to a url on the pasteboard. |
- if ([self onlyAllowsNavigation]) { |
- NSPasteboard* pboard = [info draggingPasteboard]; |
- if ([pboard containsURLData]) { |
- GURL url; |
- [self populateURL:&url |
- andTitle:NULL |
- fromPasteboard:pboard |
- convertingFilenames:YES]; |
- tabContents_->OpenURL(url, GURL(), CURRENT_TAB, |
- PageTransition::AUTO_BOOKMARK); |
- return YES; |
- } |
- return NO; |
- } |
- |
- // If the tab is showing the boomark manager, send BookmarkDrag events |
- RenderViewHostDelegate::BookmarkDrag* dragDelegate = |
- tabContents_->GetBookmarkDragDelegate(); |
- BookmarkNodeData dragData; |
- if(dragDelegate && dragData.ReadFromDragClipboard()) |
- dragDelegate->OnDrop(dragData); |
- |
- currentRVH_ = NULL; |
- |
- // Create the appropriate mouse locations for WebCore. The draggingLocation |
- // is in window coordinates. Both need to be flipped. |
- NSPoint windowPoint = [info draggingLocation]; |
- NSPoint viewPoint = [self flipWindowPointToView:windowPoint view:view]; |
- NSPoint screenPoint = [self flipWindowPointToScreen:windowPoint view:view]; |
- tabContents_->render_view_host()->DragTargetDrop( |
- gfx::Point(viewPoint.x, viewPoint.y), |
- gfx::Point(screenPoint.x, screenPoint.y)); |
- |
- return YES; |
-} |
- |
-// Populate the |url| and |title| with URL data in |pboard|. There may be more |
-// than one, but we only handle dropping the first. |url| must not be |NULL|; |
-// |title| is an optional parameter. Returns |YES| if URL data was obtained from |
-// the pasteboard, |NO| otherwise. If |convertFilenames| is |YES|, the function |
-// will also attempt to convert filenames in |pboard| to file URLs. |
-- (BOOL)populateURL:(GURL*)url |
- andTitle:(string16*)title |
- fromPasteboard:(NSPasteboard*)pboard |
- convertingFilenames:(BOOL)convertFilenames { |
- DCHECK(url); |
- DCHECK(title); |
- |
- // Bail out early if there's no URL data. |
- if (![pboard containsURLData]) |
- return NO; |
- |
- // |-getURLs:andTitles:convertingFilenames:| will already validate URIs so we |
- // don't need to again. The arrays returned are both of NSString's. |
- NSArray* urls = nil; |
- NSArray* titles = nil; |
- [pboard getURLs:&urls andTitles:&titles convertingFilenames:convertFilenames]; |
- DCHECK_EQ([urls count], [titles count]); |
- // It's possible that no URLs were actually provided! |
- if (![urls count]) |
- return NO; |
- NSString* urlString = [urls objectAtIndex:0]; |
- if ([urlString length]) { |
- // Check again just to make sure to not assign NULL into a std::string, |
- // which throws an exception. |
- const char* utf8Url = [urlString UTF8String]; |
- if (utf8Url) { |
- *url = GURL(utf8Url); |
- // Extra paranoia check. |
- if (title && [titles count]) |
- *title = base::SysNSStringToUTF16([titles objectAtIndex:0]); |
- } |
- } |
- return YES; |
-} |
- |
-// Given |data|, which should not be nil, fill it in using the contents of the |
-// given pasteboard. |
-- (void)populateWebDropData:(WebDropData*)data |
- fromPasteboard:(NSPasteboard*)pboard { |
- DCHECK(data); |
- DCHECK(pboard); |
- NSArray* types = [pboard types]; |
- |
- // Get URL if possible. To avoid exposing file system paths to web content, |
- // filenames in the drag are not converted to file URLs. |
- [self populateURL:&data->url |
- andTitle:&data->url_title |
- fromPasteboard:pboard |
- convertingFilenames:NO]; |
- |
- // Get plain text. |
- if ([types containsObject:NSStringPboardType]) { |
- data->plain_text = |
- base::SysNSStringToUTF16([pboard stringForType:NSStringPboardType]); |
- } |
- |
- // Get HTML. If there's no HTML, try RTF. |
- if ([types containsObject:NSHTMLPboardType]) { |
- data->text_html = |
- base::SysNSStringToUTF16([pboard stringForType:NSHTMLPboardType]); |
- } else if ([types containsObject:NSRTFPboardType]) { |
- NSString* html = [pboard htmlFromRtf]; |
- data->text_html = base::SysNSStringToUTF16(html); |
- } |
- |
- // Get files. |
- if ([types containsObject:NSFilenamesPboardType]) { |
- NSArray* files = [pboard propertyListForType:NSFilenamesPboardType]; |
- if ([files isKindOfClass:[NSArray class]] && [files count]) { |
- for (NSUInteger i = 0; i < [files count]; i++) { |
- NSString* filename = [files objectAtIndex:i]; |
- BOOL isDir = NO; |
- BOOL exists = [[NSFileManager defaultManager] fileExistsAtPath:filename |
- isDirectory:&isDir]; |
- if (exists && !isDir) |
- data->filenames.push_back(base::SysNSStringToUTF16(filename)); |
- } |
- } |
- } |
- |
- // TODO(pinkerton): Get file contents. http://crbug.com/34661 |
-} |
- |
-@end |