OLD | NEW |
1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2009 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/cocoa/web_drop_target.h" | 5 #import "chrome/browser/cocoa/web_drop_target.h" |
6 | 6 |
7 #include "base/sys_string_conversions.h" | 7 #include "base/sys_string_conversions.h" |
8 #include "chrome/browser/renderer_host/render_view_host.h" | 8 #include "chrome/browser/renderer_host/render_view_host.h" |
9 #include "chrome/browser/tab_contents/tab_contents.h" | 9 #include "chrome/browser/tab_contents/tab_contents.h" |
10 #import "third_party/mozilla/include/NSPasteboard+Utils.h" | 10 #import "third_party/mozilla/include/NSPasteboard+Utils.h" |
11 #include "webkit/glue/webdropdata.h" | 11 #include "webkit/glue/webdropdata.h" |
12 #include "webkit/glue/window_open_disposition.h" | 12 #include "webkit/glue/window_open_disposition.h" |
13 | 13 |
| 14 using WebKit::WebDragOperationsMask; |
| 15 |
14 @implementation WebDropTarget | 16 @implementation WebDropTarget |
15 | 17 |
16 // |contents| is the TabContents representing this tab, used to communicate | 18 // |contents| is the TabContents representing this tab, used to communicate |
17 // drag&drop messages to WebCore and handle navigation on a successful drop | 19 // drag&drop messages to WebCore and handle navigation on a successful drop |
18 // (if necessary). | 20 // (if necessary). |
19 - (id)initWithTabContents:(TabContents*)contents { | 21 - (id)initWithTabContents:(TabContents*)contents { |
20 if ((self = [super init])) { | 22 if ((self = [super init])) { |
21 tabContents_ = contents; | 23 tabContents_ = contents; |
22 } | 24 } |
23 return self; | 25 return self; |
24 } | 26 } |
25 | 27 |
26 // Call to set whether or not we should allow the drop. Takes effect the | 28 // Call to set whether or not we should allow the drop. Takes effect the |
27 // next time |-draggingUpdated:| is called. | 29 // next time |-draggingUpdated:| is called. |
28 - (void)setIsDropTarget:(BOOL)isDropTarget { | 30 - (void)setCurrentOperation: (NSDragOperation)operation { |
29 isDropTarget_ = isDropTarget; | 31 current_operation_ = operation; |
30 } | 32 } |
31 | 33 |
32 // Given a point in window coordinates and a view in that window, return a | 34 // Given a point in window coordinates and a view in that window, return a |
33 // flipped point in the coordinate system of |view|. | 35 // flipped point in the coordinate system of |view|. |
34 - (NSPoint)flipWindowPointToView:(const NSPoint&)windowPoint | 36 - (NSPoint)flipWindowPointToView:(const NSPoint&)windowPoint |
35 view:(NSView*)view { | 37 view:(NSView*)view { |
36 DCHECK(view); | 38 DCHECK(view); |
37 NSPoint viewPoint = [view convertPoint:windowPoint fromView:nil]; | 39 NSPoint viewPoint = [view convertPoint:windowPoint fromView:nil]; |
38 NSRect viewFrame = [view frame]; | 40 NSRect viewFrame = [view frame]; |
39 viewPoint.y = viewFrame.size.height - viewPoint.y; | 41 viewPoint.y = viewFrame.size.height - viewPoint.y; |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
78 | 80 |
79 // Fill out a WebDropData from pasteboard. | 81 // Fill out a WebDropData from pasteboard. |
80 WebDropData data; | 82 WebDropData data; |
81 [self populateWebDropData:&data fromPasteboard:[info draggingPasteboard]]; | 83 [self populateWebDropData:&data fromPasteboard:[info draggingPasteboard]]; |
82 | 84 |
83 // Create the appropriate mouse locations for WebCore. The draggingLocation | 85 // Create the appropriate mouse locations for WebCore. The draggingLocation |
84 // is in window coordinates. Both need to be flipped. | 86 // is in window coordinates. Both need to be flipped. |
85 NSPoint windowPoint = [info draggingLocation]; | 87 NSPoint windowPoint = [info draggingLocation]; |
86 NSPoint viewPoint = [self flipWindowPointToView:windowPoint view:view]; | 88 NSPoint viewPoint = [self flipWindowPointToView:windowPoint view:view]; |
87 NSPoint screenPoint = [self flipWindowPointToScreen:windowPoint view:view]; | 89 NSPoint screenPoint = [self flipWindowPointToScreen:windowPoint view:view]; |
| 90 NSDragOperation mask = [info draggingSourceOperationMask]; |
88 tabContents_->render_view_host()->DragTargetDragEnter(data, | 91 tabContents_->render_view_host()->DragTargetDragEnter(data, |
89 gfx::Point(viewPoint.x, viewPoint.y), | 92 gfx::Point(viewPoint.x, viewPoint.y), |
90 gfx::Point(screenPoint.x, screenPoint.y)); | 93 gfx::Point(screenPoint.x, screenPoint.y), |
| 94 static_cast<WebDragOperationsMask>(mask)); |
91 | 95 |
92 isDropTarget_ = YES; | 96 // We won't know the true operation (whether the drag is allowed) until we |
93 | 97 // hear back from the renderer. For now, be optimistic: |
94 return NSDragOperationCopy; | 98 current_operation_ = NSDragOperationCopy; |
| 99 return current_operation_; |
95 } | 100 } |
96 | 101 |
97 - (void)draggingExited:(id<NSDraggingInfo>)info { | 102 - (void)draggingExited:(id<NSDraggingInfo>)info { |
98 DCHECK(currentRVH_); | 103 DCHECK(currentRVH_); |
99 if (currentRVH_ != tabContents_->render_view_host()) | 104 if (currentRVH_ != tabContents_->render_view_host()) |
100 return; | 105 return; |
101 | 106 |
102 // Nothing to do in the interstitial case. | 107 // Nothing to do in the interstitial case. |
103 | 108 |
104 tabContents_->render_view_host()->DragTargetDragLeave(); | 109 tabContents_->render_view_host()->DragTargetDragLeave(); |
105 } | 110 } |
106 | 111 |
107 - (NSDragOperation)draggingUpdated:(id<NSDraggingInfo>)info | 112 - (NSDragOperation)draggingUpdated:(id<NSDraggingInfo>)info |
108 view:(NSView*)view { | 113 view:(NSView*)view { |
109 DCHECK(currentRVH_); | 114 DCHECK(currentRVH_); |
110 if (currentRVH_ != tabContents_->render_view_host()) | 115 if (currentRVH_ != tabContents_->render_view_host()) |
111 [self draggingEntered:info]; | 116 [self draggingEntered:info]; |
112 | 117 |
113 if ([self onlyAllowsNavigation]) { | 118 if ([self onlyAllowsNavigation]) { |
114 if ([[info draggingPasteboard] containsURLData]) | 119 if ([[info draggingPasteboard] containsURLData]) |
115 return NSDragOperationCopy; | 120 return NSDragOperationCopy; |
116 return NSDragOperationNone; | 121 return NSDragOperationNone; |
117 } | 122 } |
118 | 123 |
119 // Create the appropriate mouse locations for WebCore. The draggingLocation | 124 // Create the appropriate mouse locations for WebCore. The draggingLocation |
120 // is in window coordinates. | 125 // is in window coordinates. |
121 NSPoint windowPoint = [info draggingLocation]; | 126 NSPoint windowPoint = [info draggingLocation]; |
122 NSPoint viewPoint = [self flipWindowPointToView:windowPoint view:view]; | 127 NSPoint viewPoint = [self flipWindowPointToView:windowPoint view:view]; |
123 NSPoint screenPoint = [self flipWindowPointToScreen:windowPoint view:view]; | 128 NSPoint screenPoint = [self flipWindowPointToScreen:windowPoint view:view]; |
| 129 NSDragOperation mask = [info draggingSourceOperationMask]; |
124 tabContents_->render_view_host()->DragTargetDragOver( | 130 tabContents_->render_view_host()->DragTargetDragOver( |
125 gfx::Point(viewPoint.x, viewPoint.y), | 131 gfx::Point(viewPoint.x, viewPoint.y), |
126 gfx::Point(screenPoint.x, screenPoint.y)); | 132 gfx::Point(screenPoint.x, screenPoint.y), |
| 133 static_cast<WebDragOperationsMask>(mask)); |
127 | 134 |
128 if (!isDropTarget_) | 135 return current_operation_; |
129 return NSDragOperationNone; | |
130 return NSDragOperationCopy; | |
131 } | 136 } |
132 | 137 |
133 - (BOOL)performDragOperation:(id<NSDraggingInfo>)info | 138 - (BOOL)performDragOperation:(id<NSDraggingInfo>)info |
134 view:(NSView*)view { | 139 view:(NSView*)view { |
135 if (currentRVH_ != tabContents_->render_view_host()) | 140 if (currentRVH_ != tabContents_->render_view_host()) |
136 [self draggingEntered:info]; | 141 [self draggingEntered:info]; |
137 | 142 |
138 // Check if we only allow navigation and navigate to a url on the pasteboard. | 143 // Check if we only allow navigation and navigate to a url on the pasteboard. |
139 if ([self onlyAllowsNavigation]) { | 144 if ([self onlyAllowsNavigation]) { |
140 NSPasteboard* pboard = [info draggingPasteboard]; | 145 NSPasteboard* pboard = [info draggingPasteboard]; |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
200 // Get HTML. | 205 // Get HTML. |
201 if ([types containsObject:NSHTMLPboardType]) { | 206 if ([types containsObject:NSHTMLPboardType]) { |
202 data->text_html = | 207 data->text_html = |
203 base::SysNSStringToUTF16([pboard stringForType:NSHTMLPboardType]); | 208 base::SysNSStringToUTF16([pboard stringForType:NSHTMLPboardType]); |
204 } | 209 } |
205 | 210 |
206 // TODO(pinkerton): Get files and file contents. | 211 // TODO(pinkerton): Get files and file contents. |
207 } | 212 } |
208 | 213 |
209 @end | 214 @end |
OLD | NEW |