Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3820)

Unified Diff: chrome/browser/ui/cocoa/web_drop_target.mm

Issue 6358008: [Mac] Organize some files into chrome/browser/ui/cocoa/tab_contents/.... (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Created 9 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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

Powered by Google App Engine
This is Rietveld 408576698