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

Side by Side Diff: ui/views/cocoa/drag_drop_client_mac_unittest.mm

Issue 1964283002: MacViews: Implemented Drag & Drop (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: fix for dcheng Created 4 years, 6 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 unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #import "ui/views/cocoa/drag_drop_client_mac.h"
6
7 #import <Cocoa/Cocoa.h>
8
9 #include "base/mac/sdk_forward_declarations.h"
10 #include "base/strings/utf_string_conversions.h"
11 #import "ui/views/cocoa/bridged_native_widget.h"
12 #include "ui/views/test/widget_test.h"
13 #include "ui/views/view.h"
14 #include "ui/views/widget/native_widget_mac.h"
15 #include "ui/views/widget/widget.h"
16
17 using base::ASCIIToUTF16;
18
19 // Mocks the NSDraggingInfo sent to the DragDropClientMac's DragUpdate() and
20 // Drop() methods. Out of the required methods of the protocol, only
21 // draggingLocation and draggingPasteboard are used.
22 @interface MockDraggingInfo : NSObject<NSDraggingInfo> {
23 NSPasteboard* pasteboard_;
24 }
25
26 @property BOOL animatesToDestination;
27 @property NSInteger numberOfValidItemsForDrop;
28 @property NSDraggingFormation draggingFormation;
29 @property(readonly) NSSpringLoadingHighlight springLoadingHighlight;
30
31 @end
32
33 @implementation MockDraggingInfo
34
35 @synthesize animatesToDestination;
36 @synthesize numberOfValidItemsForDrop;
37 @synthesize draggingFormation;
38 @synthesize springLoadingHighlight;
39
40 - (id)initWithPasteboard:(NSPasteboard*)pasteboard {
41 if ((self = [super init])) {
42 pasteboard_ = pasteboard;
43 }
44 return self;
45 }
46
47 - (NSPoint)draggingLocation {
48 return NSMakePoint(50, 50);
49 }
50
51 - (NSPasteboard*)draggingPasteboard {
52 return pasteboard_;
53 }
54
55 - (NSInteger)draggingSequenceNumber {
56 return 0;
57 }
58
59 - (id)draggingSource {
60 return nil;
61 }
62
63 - (NSDragOperation)draggingSourceOperationMask {
64 return NSDragOperationNone;
65 }
66
67 - (NSWindow*)draggingDestinationWindow {
68 return nil;
69 }
70
71 - (NSArray*)namesOfPromisedFilesDroppedAtDestination:(NSURL*)dropDestination {
72 return nil;
73 }
74
75 - (NSImage*)draggedImage {
76 return nil;
77 }
78
79 - (NSPoint)draggedImageLocation {
80 return NSZeroPoint;
81 }
82
83 - (void)slideDraggedImageTo:(NSPoint)aPoint {
84 }
85
86 - (void)
87 enumerateDraggingItemsWithOptions:(NSDraggingItemEnumerationOptions)enumOpts
88 forView:(NSView*)view
89 classes:(NSArray*)classArray
90 searchOptions:(NSDictionary*)searchOptions
91 usingBlock:(void (^)(NSDraggingItem* draggingItem,
92 NSInteger idx,
93 BOOL* stop))block {
94 }
95
96 - (void)resetSpringLoading {
97 }
98
99 @end
100
101 namespace views {
102 namespace test {
103
104 // View object that will receive and process dropped data from the test.
105 class DragDropView : public View {
106 public:
107 DragDropView() {}
108
109 void set_formats(int formats) { formats_ = formats; }
110
111 // View:
112 bool GetDropFormats(
113 int* formats,
114 std::set<ui::Clipboard::FormatType>* format_types) override {
115 *formats |= formats_;
116 return true;
117 }
118
119 bool CanDrop(const OSExchangeData& data) override { return true; }
120
121 int OnDragUpdated(const ui::DropTargetEvent& event) override {
122 return ui::DragDropTypes::DRAG_COPY;
123 }
124
125 int OnPerformDrop(const ui::DropTargetEvent& event) override {
126 return ui::DragDropTypes::DRAG_MOVE;
127 }
128
129 private:
130 // Drop formats accepted by this View object.
131 int formats_ = 0;
132
133 DISALLOW_COPY_AND_ASSIGN(DragDropView);
134 };
135
136 class DragDropClientMacTest : public WidgetTest {
137 public:
138 DragDropClientMacTest() : widget_(new Widget) {}
139
140 DragDropClientMac* drag_drop_client() { return bridge_->drag_drop_client(); }
141
142 NSDragOperation DragUpdate(NSPasteboard* pasteboard) {
143 DragDropClientMac* client = drag_drop_client();
144 dragging_info_.reset(
145 [[MockDraggingInfo alloc] initWithPasteboard:pasteboard]);
146 return client->DragUpdate(dragging_info_.get());
147 }
148
149 NSDragOperation Drop() {
150 DragDropClientMac* client = drag_drop_client();
151 DCHECK(dragging_info_.get());
152 NSDragOperation operation = client->Drop(dragging_info_.get());
153 dragging_info_.reset();
154 return operation;
155 }
156
157 void SetData(OSExchangeData& data) {
158 drag_drop_client()->data_source_.reset(
159 [[CocoaDragDropDataProvider alloc] initWithData:data]);
160 }
161
162 // testing::Test:
163 void SetUp() override {
164 WidgetTest::SetUp();
165
166 widget_ = CreateTopLevelPlatformWidget();
167 gfx::Rect bounds(0, 0, 100, 100);
168 widget_->SetBounds(bounds);
169
170 bridge_ =
171 NativeWidgetMac::GetBridgeForNativeWindow(widget_->GetNativeWindow());
172 widget_->Show();
173
174 target_ = new DragDropView();
175 widget_->GetContentsView()->AddChildView(target_);
176 target_->SetBoundsRect(bounds);
177
178 drag_drop_client()->operation_ = ui::DragDropTypes::DRAG_COPY;
179 }
180
181 void TearDown() override {
182 widget_->CloseNow();
183 WidgetTest::TearDown();
184 }
185
186 protected:
187 Widget* widget_ = nullptr;
188 BridgedNativeWidget* bridge_ = nullptr;
189 DragDropView* target_ = nullptr;
190 base::scoped_nsobject<MockDraggingInfo> dragging_info_;
191
192 private:
193 DISALLOW_COPY_AND_ASSIGN(DragDropClientMacTest);
194 };
195
196 // Tests if the drag and drop target receives the dropped data.
197 TEST_F(DragDropClientMacTest, BasicDragDrop) {
198 // Create the drop data
199 OSExchangeData data;
200 const base::string16& text = ASCIIToUTF16("text");
201 data.SetString(text);
202 SetData(data);
203
204 target_->set_formats(ui::OSExchangeData::STRING | ui::OSExchangeData::URL);
205
206 // Check if the target receives the data from a drop and returns the expected
207 // operation.
208 EXPECT_EQ(DragUpdate(nil), NSDragOperationCopy);
209 EXPECT_EQ(Drop(), NSDragOperationMove);
210 }
211
212 // Tests if the drag and drop target rejects the dropped data with the
213 // incorrect format.
214 TEST_F(DragDropClientMacTest, InvalidFormatDragDrop) {
215 OSExchangeData data;
216 const base::string16& text = ASCIIToUTF16("text");
217 data.SetString(text);
218 SetData(data);
219
220 target_->set_formats(ui::OSExchangeData::URL);
221
222 // Check if the target receives the data from a drop and returns the expected
223 // operation.
224 EXPECT_EQ(DragUpdate(nil), NSDragOperationNone);
225 EXPECT_EQ(Drop(), NSDragOperationNone);
226 }
227
228 // Tests if the drag and drop target can accept data without an OSExchangeData
229 // object.
230 TEST_F(DragDropClientMacTest, PasteboardToOSExchangeTest) {
231 target_->set_formats(ui::OSExchangeData::STRING);
232
233 NSPasteboard* pasteboard = [NSPasteboard pasteboardWithUniqueName];
234
235 // The test should reject the data if the pasteboard is empty.
236 EXPECT_EQ(DragUpdate(pasteboard), NSDragOperationNone);
237 EXPECT_EQ(Drop(), NSDragOperationNone);
238 drag_drop_client()->EndDrag();
239
240 // Add valid data to the pasteboard and check to see if the target accepts
241 // it.
242 [pasteboard setString:@"text" forType:NSPasteboardTypeString];
243 EXPECT_EQ(DragUpdate(pasteboard), NSDragOperationCopy);
244 EXPECT_EQ(Drop(), NSDragOperationMove);
245 }
246
247 } // namespace test
248 } // namespace views
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698