| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #import "chrome/browser/ui/cocoa/tab_contents/web_drop_target.h" | 5 #import "chrome/browser/ui/cocoa/tab_contents/web_drop_target.h" |
| 6 | 6 |
| 7 #include "base/sys_string_conversions.h" | 7 #include "base/sys_string_conversions.h" |
| 8 #include "chrome/browser/bookmarks/bookmark_node_data.h" | |
| 9 #include "chrome/browser/ui/bookmarks/bookmark_tab_helper.h" | |
| 10 #include "chrome/browser/ui/browser.h" | |
| 11 #include "chrome/browser/ui/browser_window.h" | |
| 12 #include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h" | |
| 13 #include "content/browser/renderer_host/render_view_host.h" | 8 #include "content/browser/renderer_host/render_view_host.h" |
| 14 #include "content/browser/tab_contents/tab_contents.h" | 9 #include "content/browser/tab_contents/tab_contents.h" |
| 10 #include "content/browser/tab_contents/web_drag_dest_delegate.h" |
| 15 #import "third_party/mozilla/NSPasteboard+Utils.h" | 11 #import "third_party/mozilla/NSPasteboard+Utils.h" |
| 16 #import "ui/base/dragdrop/cocoa_dnd_util.h" | 12 #import "ui/base/dragdrop/cocoa_dnd_util.h" |
| 17 #include "webkit/glue/webdropdata.h" | 13 #include "webkit/glue/webdropdata.h" |
| 18 #include "webkit/glue/window_open_disposition.h" | 14 #include "webkit/glue/window_open_disposition.h" |
| 19 | 15 |
| 20 using WebKit::WebDragOperationsMask; | 16 using WebKit::WebDragOperationsMask; |
| 21 | 17 |
| 22 @implementation WebDropTarget | 18 @implementation WebDropTarget |
| 23 | 19 |
| 24 // |contents| is the TabContents representing this tab, used to communicate | 20 // |contents| is the TabContents representing this tab, used to communicate |
| 25 // drag&drop messages to WebCore and handle navigation on a successful drop | 21 // drag&drop messages to WebCore and handle navigation on a successful drop |
| 26 // (if necessary). | 22 // (if necessary). |
| 27 - (id)initWithTabContents:(TabContents*)contents { | 23 - (id)initWithTabContents:(TabContents*)contents { |
| 28 if ((self = [super init])) { | 24 if ((self = [super init])) { |
| 29 tabContents_ = contents; | 25 tabContents_ = contents; |
| 30 } | 26 } |
| 31 return self; | 27 return self; |
| 32 } | 28 } |
| 33 | 29 |
| 30 - (void)setDragDelegate:(content::WebDragDestDelegate*)delegate { |
| 31 delegate_ = delegate; |
| 32 } |
| 33 |
| 34 // Call to set whether or not we should allow the drop. Takes effect the | 34 // Call to set whether or not we should allow the drop. Takes effect the |
| 35 // next time |-draggingUpdated:| is called. | 35 // next time |-draggingUpdated:| is called. |
| 36 - (void)setCurrentOperation: (NSDragOperation)operation { | 36 - (void)setCurrentOperation: (NSDragOperation)operation { |
| 37 current_operation_ = operation; | 37 current_operation_ = operation; |
| 38 } | 38 } |
| 39 | 39 |
| 40 // Given a point in window coordinates and a view in that window, return a | 40 // Given a point in window coordinates and a view in that window, return a |
| 41 // flipped point in the coordinate system of |view|. | 41 // flipped point in the coordinate system of |view|. |
| 42 - (NSPoint)flipWindowPointToView:(const NSPoint&)windowPoint | 42 - (NSPoint)flipWindowPointToView:(const NSPoint&)windowPoint |
| 43 view:(NSView*)view { | 43 view:(NSView*)view { |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 77 // Save off the RVH so we can tell if it changes during a drag. If it does, | 77 // Save off the RVH so we can tell if it changes during a drag. If it does, |
| 78 // we need to send a new enter message in draggingUpdated:. | 78 // we need to send a new enter message in draggingUpdated:. |
| 79 currentRVH_ = tabContents_->render_view_host(); | 79 currentRVH_ = tabContents_->render_view_host(); |
| 80 | 80 |
| 81 if ([self onlyAllowsNavigation]) { | 81 if ([self onlyAllowsNavigation]) { |
| 82 if ([[info draggingPasteboard] containsURLData]) | 82 if ([[info draggingPasteboard] containsURLData]) |
| 83 return NSDragOperationCopy; | 83 return NSDragOperationCopy; |
| 84 return NSDragOperationNone; | 84 return NSDragOperationNone; |
| 85 } | 85 } |
| 86 | 86 |
| 87 if (!tab_) | 87 if (delegate_) { |
| 88 tab_ = TabContentsWrapper::GetCurrentWrapperForContents(tabContents_); | 88 delegate_->DragInitialize(tabContents_); |
| 89 | 89 delegate_->OnDragEnter(); |
| 90 // If the tab is showing the bookmark manager, send BookmarkDrag events | 90 } |
| 91 BookmarkTabHelper::BookmarkDrag* dragDelegate = | |
| 92 tab_ ? tab_->bookmark_tab_helper()->GetBookmarkDragDelegate() : NULL; | |
| 93 BookmarkNodeData dragData; | |
| 94 if(dragDelegate && dragData.ReadFromDragClipboard()) | |
| 95 dragDelegate->OnDragEnter(dragData); | |
| 96 | 91 |
| 97 // Fill out a WebDropData from pasteboard. | 92 // Fill out a WebDropData from pasteboard. |
| 98 WebDropData data; | 93 WebDropData data; |
| 99 [self populateWebDropData:&data fromPasteboard:[info draggingPasteboard]]; | 94 [self populateWebDropData:&data fromPasteboard:[info draggingPasteboard]]; |
| 100 | 95 |
| 101 // Create the appropriate mouse locations for WebCore. The draggingLocation | 96 // Create the appropriate mouse locations for WebCore. The draggingLocation |
| 102 // is in window coordinates. Both need to be flipped. | 97 // is in window coordinates. Both need to be flipped. |
| 103 NSPoint windowPoint = [info draggingLocation]; | 98 NSPoint windowPoint = [info draggingLocation]; |
| 104 NSPoint viewPoint = [self flipWindowPointToView:windowPoint view:view]; | 99 NSPoint viewPoint = [self flipWindowPointToView:windowPoint view:view]; |
| 105 NSPoint screenPoint = [self flipWindowPointToScreen:windowPoint view:view]; | 100 NSPoint screenPoint = [self flipWindowPointToScreen:windowPoint view:view]; |
| 106 NSDragOperation mask = [info draggingSourceOperationMask]; | 101 NSDragOperation mask = [info draggingSourceOperationMask]; |
| 107 tabContents_->render_view_host()->DragTargetDragEnter(data, | 102 tabContents_->render_view_host()->DragTargetDragEnter(data, |
| 108 gfx::Point(viewPoint.x, viewPoint.y), | 103 gfx::Point(viewPoint.x, viewPoint.y), |
| 109 gfx::Point(screenPoint.x, screenPoint.y), | 104 gfx::Point(screenPoint.x, screenPoint.y), |
| 110 static_cast<WebDragOperationsMask>(mask)); | 105 static_cast<WebDragOperationsMask>(mask)); |
| 111 | 106 |
| 112 // We won't know the true operation (whether the drag is allowed) until we | 107 // We won't know the true operation (whether the drag is allowed) until we |
| 113 // hear back from the renderer. For now, be optimistic: | 108 // hear back from the renderer. For now, be optimistic: |
| 114 current_operation_ = NSDragOperationCopy; | 109 current_operation_ = NSDragOperationCopy; |
| 115 return current_operation_; | 110 return current_operation_; |
| 116 } | 111 } |
| 117 | 112 |
| 118 - (void)draggingExited:(id<NSDraggingInfo>)info { | 113 - (void)draggingExited:(id<NSDraggingInfo>)info { |
| 119 DCHECK(currentRVH_); | 114 DCHECK(currentRVH_); |
| 120 if (currentRVH_ != tabContents_->render_view_host()) | 115 if (currentRVH_ != tabContents_->render_view_host()) |
| 121 return; | 116 return; |
| 122 | 117 |
| 123 // Nothing to do in the interstitial case. | 118 // Nothing to do in the interstitial case. |
| 124 | 119 |
| 120 if (delegate_) |
| 121 delegate_->OnDragLeave(); |
| 122 |
| 125 tabContents_->render_view_host()->DragTargetDragLeave(); | 123 tabContents_->render_view_host()->DragTargetDragLeave(); |
| 126 } | 124 } |
| 127 | 125 |
| 128 - (NSDragOperation)draggingUpdated:(id<NSDraggingInfo>)info | 126 - (NSDragOperation)draggingUpdated:(id<NSDraggingInfo>)info |
| 129 view:(NSView*)view { | 127 view:(NSView*)view { |
| 130 DCHECK(currentRVH_); | 128 DCHECK(currentRVH_); |
| 131 if (currentRVH_ != tabContents_->render_view_host()) | 129 if (currentRVH_ != tabContents_->render_view_host()) |
| 132 [self draggingEntered:info view:view]; | 130 [self draggingEntered:info view:view]; |
| 133 | 131 |
| 134 if ([self onlyAllowsNavigation]) { | 132 if ([self onlyAllowsNavigation]) { |
| 135 if ([[info draggingPasteboard] containsURLData]) | 133 if ([[info draggingPasteboard] containsURLData]) |
| 136 return NSDragOperationCopy; | 134 return NSDragOperationCopy; |
| 137 return NSDragOperationNone; | 135 return NSDragOperationNone; |
| 138 } | 136 } |
| 139 | 137 |
| 140 // Create the appropriate mouse locations for WebCore. The draggingLocation | 138 // Create the appropriate mouse locations for WebCore. The draggingLocation |
| 141 // is in window coordinates. | 139 // is in window coordinates. |
| 142 NSPoint windowPoint = [info draggingLocation]; | 140 NSPoint windowPoint = [info draggingLocation]; |
| 143 NSPoint viewPoint = [self flipWindowPointToView:windowPoint view:view]; | 141 NSPoint viewPoint = [self flipWindowPointToView:windowPoint view:view]; |
| 144 NSPoint screenPoint = [self flipWindowPointToScreen:windowPoint view:view]; | 142 NSPoint screenPoint = [self flipWindowPointToScreen:windowPoint view:view]; |
| 145 NSDragOperation mask = [info draggingSourceOperationMask]; | 143 NSDragOperation mask = [info draggingSourceOperationMask]; |
| 146 tabContents_->render_view_host()->DragTargetDragOver( | 144 tabContents_->render_view_host()->DragTargetDragOver( |
| 147 gfx::Point(viewPoint.x, viewPoint.y), | 145 gfx::Point(viewPoint.x, viewPoint.y), |
| 148 gfx::Point(screenPoint.x, screenPoint.y), | 146 gfx::Point(screenPoint.x, screenPoint.y), |
| 149 static_cast<WebDragOperationsMask>(mask)); | 147 static_cast<WebDragOperationsMask>(mask)); |
| 150 | 148 |
| 151 // If the tab is showing the bookmark manager, send BookmarkDrag events | 149 if (delegate_) |
| 152 BookmarkTabHelper::BookmarkDrag* dragDelegate = | 150 delegate_->OnDragOver(); |
| 153 tab_ ? tab_->bookmark_tab_helper()->GetBookmarkDragDelegate() : NULL; | 151 |
| 154 BookmarkNodeData dragData; | |
| 155 if(dragDelegate && dragData.ReadFromDragClipboard()) | |
| 156 dragDelegate->OnDragOver(dragData); | |
| 157 return current_operation_; | 152 return current_operation_; |
| 158 } | 153 } |
| 159 | 154 |
| 160 - (BOOL)performDragOperation:(id<NSDraggingInfo>)info | 155 - (BOOL)performDragOperation:(id<NSDraggingInfo>)info |
| 161 view:(NSView*)view { | 156 view:(NSView*)view { |
| 162 if (currentRVH_ != tabContents_->render_view_host()) | 157 if (currentRVH_ != tabContents_->render_view_host()) |
| 163 [self draggingEntered:info view:view]; | 158 [self draggingEntered:info view:view]; |
| 164 | 159 |
| 165 // Check if we only allow navigation and navigate to a url on the pasteboard. | 160 // Check if we only allow navigation and navigate to a url on the pasteboard. |
| 166 if ([self onlyAllowsNavigation]) { | 161 if ([self onlyAllowsNavigation]) { |
| 167 NSPasteboard* pboard = [info draggingPasteboard]; | 162 NSPasteboard* pboard = [info draggingPasteboard]; |
| 168 if ([pboard containsURLData]) { | 163 if ([pboard containsURLData]) { |
| 169 GURL url; | 164 GURL url; |
| 170 ui::PopulateURLAndTitleFromPasteboard(&url, NULL, pboard, YES); | 165 ui::PopulateURLAndTitleFromPasteboard(&url, NULL, pboard, YES); |
| 171 tabContents_->OpenURL(url, GURL(), CURRENT_TAB, | 166 tabContents_->OpenURL(url, GURL(), CURRENT_TAB, |
| 172 content::PAGE_TRANSITION_AUTO_BOOKMARK); | 167 content::PAGE_TRANSITION_AUTO_BOOKMARK); |
| 173 return YES; | 168 return YES; |
| 174 } | 169 } |
| 175 return NO; | 170 return NO; |
| 176 } | 171 } |
| 177 | 172 |
| 178 // If the tab is showing the bookmark manager, send BookmarkDrag events | 173 if (delegate_) |
| 179 BookmarkTabHelper::BookmarkDrag* dragDelegate = | 174 delegate_->OnDrop(); |
| 180 tab_ ? tab_->bookmark_tab_helper()->GetBookmarkDragDelegate() : NULL; | |
| 181 BookmarkNodeData dragData; | |
| 182 if(dragDelegate && dragData.ReadFromDragClipboard()) | |
| 183 dragDelegate->OnDrop(dragData); | |
| 184 | 175 |
| 185 currentRVH_ = NULL; | 176 currentRVH_ = NULL; |
| 186 | 177 |
| 187 // Create the appropriate mouse locations for WebCore. The draggingLocation | 178 // Create the appropriate mouse locations for WebCore. The draggingLocation |
| 188 // is in window coordinates. Both need to be flipped. | 179 // is in window coordinates. Both need to be flipped. |
| 189 NSPoint windowPoint = [info draggingLocation]; | 180 NSPoint windowPoint = [info draggingLocation]; |
| 190 NSPoint viewPoint = [self flipWindowPointToView:windowPoint view:view]; | 181 NSPoint viewPoint = [self flipWindowPointToView:windowPoint view:view]; |
| 191 NSPoint screenPoint = [self flipWindowPointToScreen:windowPoint view:view]; | 182 NSPoint screenPoint = [self flipWindowPointToScreen:windowPoint view:view]; |
| 192 tabContents_->render_view_host()->DragTargetDrop( | 183 tabContents_->render_view_host()->DragTargetDrop( |
| 193 gfx::Point(viewPoint.x, viewPoint.y), | 184 gfx::Point(viewPoint.x, viewPoint.y), |
| 194 gfx::Point(screenPoint.x, screenPoint.y)); | 185 gfx::Point(screenPoint.x, screenPoint.y)); |
| 195 | 186 |
| 196 // Focus the target browser. | |
| 197 Browser* browser = Browser::GetBrowserForController( | |
| 198 &tabContents_->controller(), NULL); | |
| 199 if (browser) | |
| 200 browser->window()->Show(); | |
| 201 | |
| 202 return YES; | 187 return YES; |
| 203 } | 188 } |
| 204 | 189 |
| 205 // Given |data|, which should not be nil, fill it in using the contents of the | 190 // Given |data|, which should not be nil, fill it in using the contents of the |
| 206 // given pasteboard. | 191 // given pasteboard. |
| 207 - (void)populateWebDropData:(WebDropData*)data | 192 - (void)populateWebDropData:(WebDropData*)data |
| 208 fromPasteboard:(NSPasteboard*)pboard { | 193 fromPasteboard:(NSPasteboard*)pboard { |
| 209 DCHECK(data); | 194 DCHECK(data); |
| 210 DCHECK(pboard); | 195 DCHECK(pboard); |
| 211 NSArray* types = [pboard types]; | 196 NSArray* types = [pboard types]; |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 244 if (exists && !isDir) | 229 if (exists && !isDir) |
| 245 data->filenames.push_back(base::SysNSStringToUTF16(filename)); | 230 data->filenames.push_back(base::SysNSStringToUTF16(filename)); |
| 246 } | 231 } |
| 247 } | 232 } |
| 248 } | 233 } |
| 249 | 234 |
| 250 // TODO(pinkerton): Get file contents. http://crbug.com/34661 | 235 // TODO(pinkerton): Get file contents. http://crbug.com/34661 |
| 251 } | 236 } |
| 252 | 237 |
| 253 @end | 238 @end |
| OLD | NEW |