Index: ui/views/cocoa/desktop_drag_drop_client_mac_unittest.mm |
diff --git a/ui/views/cocoa/desktop_drag_drop_client_mac_unittest.mm b/ui/views/cocoa/desktop_drag_drop_client_mac_unittest.mm |
new file mode 100644 |
index 0000000000000000000000000000000000000000..06d12b5d0db5e0aea731a98132b571f6ec6203cc |
--- /dev/null |
+++ b/ui/views/cocoa/desktop_drag_drop_client_mac_unittest.mm |
@@ -0,0 +1,245 @@ |
+// Copyright 2016 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 "ui/views/cocoa/drag_drop_client_mac.h" |
+ |
+#import <Cocoa/Cocoa.h> |
+ |
+#include "base/mac/sdk_forward_declarations.h" |
+#include "base/strings/utf_string_conversions.h" |
+#import "ui/views/cocoa/bridged_content_view.h" |
+#import "ui/views/cocoa/bridged_native_widget.h" |
+#include "ui/views/test/widget_test.h" |
+#include "ui/views/view.h" |
+#include "ui/views/widget/native_widget_mac.h" |
+#include "ui/views/widget/root_view.h" |
+#include "ui/views/widget/widget.h" |
+ |
+using base::ASCIIToUTF16; |
+ |
+// Mocks the NSDraggingInfo sent to the DragDropClientMac's DragUpdate() and |
+// Drop() methods. Out of the required methods of NSDraggingInfo, only |
+// draggingLocation and draggingPasteboard are used. |
+@interface MockDraggingInfo : NSObject<NSDraggingInfo> { |
+ NSPasteboard* pasteboard_; |
+} |
+ |
+@property BOOL animatesToDestination; |
+@property NSInteger numberOfValidItemsForDrop; |
+@property NSDraggingFormation draggingFormation; |
+@property(readonly) NSSpringLoadingHighlight springLoadingHighlight; |
+ |
+@end |
+ |
+@implementation MockDraggingInfo |
+ |
+@synthesize animatesToDestination; |
+@synthesize numberOfValidItemsForDrop; |
+@synthesize draggingFormation; |
+@synthesize springLoadingHighlight; |
+ |
+- (id)initWithPasteboard:(NSPasteboard*)pasteboard { |
+ if ((self = [super init])) { |
+ pasteboard_ = pasteboard; |
+ } |
+ return self; |
+} |
+ |
+- (NSPoint)draggingLocation { |
+ return NSMakePoint(50, 50); |
+} |
+ |
+- (NSPasteboard*)draggingPasteboard { |
+ return pasteboard_; |
+} |
+ |
+- (NSInteger)draggingSequenceNumber { |
+ return 0; |
+} |
+ |
+- (id)draggingSource { |
+ return nil; |
+} |
+ |
+- (NSDragOperation)draggingSourceOperationMask { |
+ return NSDragOperationNone; |
+} |
+ |
+- (NSWindow*)draggingDestinationWindow { |
+ return nil; |
+} |
+ |
+- (NSArray*)namesOfPromisedFilesDroppedAtDestination:(NSURL*)dropDestination { |
+ return nil; |
+} |
+ |
+- (NSImage*)draggedImage { |
+ return nil; |
+} |
+ |
+- (NSPoint)draggedImageLocation { |
+ return NSZeroPoint; |
+} |
+ |
+- (void)slideDraggedImageTo:(NSPoint)aPoint { |
+} |
+ |
+- (void) |
+enumerateDraggingItemsWithOptions:(NSDraggingItemEnumerationOptions)enumOpts |
+ forView:(NSView*)view |
+ classes:(NSArray*)classArray |
+ searchOptions:(NSDictionary*)searchOptions |
+ usingBlock:(void (^)(NSDraggingItem* draggingItem, |
+ NSInteger idx, |
+ BOOL* stop))block { |
+} |
+ |
+- (void)resetSpringLoading { |
+} |
+ |
+@end |
+ |
+namespace views { |
+namespace test { |
+ |
+// View object that will receive and process dropped data from the test. |
+class DragDropView : public View { |
+ public: |
+ DragDropView() {} |
+ |
+ void set_formats(int formats) { formats_ = formats; } |
+ |
+ // Views: |
+ bool GetDropFormats( |
+ int* formats, |
+ std::set<ui::Clipboard::FormatType>* format_types) override { |
+ *formats |= formats_; |
+ return true; |
+ } |
+ |
+ bool CanDrop(const OSExchangeData& data) override { return true; } |
+ |
+ int OnDragUpdated(const ui::DropTargetEvent& event) override { |
+ return ui::DragDropTypes::DRAG_COPY; |
+ } |
+ |
+ int OnPerformDrop(const ui::DropTargetEvent& event) override { |
+ return ui::DragDropTypes::DRAG_MOVE; |
+ } |
+ |
+ private: |
+ // Drop formats accepted by this View object. |
+ int formats_ = 0; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(DragDropView); |
+}; |
+ |
+class CocoaDragDropTest : public WidgetTest { |
+ public: |
+ CocoaDragDropTest() : widget_(new Widget) {} |
+ |
+ DragDropClientMac* drag_drop_client() { return bridge_->drag_drop_client(); } |
+ |
+ void SetUp() override { |
+ WidgetTest::SetUp(); |
+ |
+ widget_ = CreateTopLevelPlatformWidget(); |
+ gfx::Rect bounds(0, 0, 100, 100); |
+ widget_->SetBounds(bounds); |
+ |
+ bridge_ = |
+ NativeWidgetMac::GetBridgeForNativeWindow(widget_->GetNativeWindow()); |
+ widget_->Show(); |
+ |
+ target_ = new DragDropView(); |
+ widget_->GetContentsView()->AddChildView(target_); |
+ target_->SetBoundsRect(bounds); |
+ |
+ drag_drop_client()->operation_ = ui::DragDropTypes::DRAG_COPY; |
+ } |
+ |
+ void TearDown() override { |
+ widget_->CloseNow(); |
+ WidgetTest::TearDown(); |
+ } |
+ |
+ NSDragOperation DragUpdate(NSPasteboard* pasteboard) { |
+ DragDropClientMac* client = drag_drop_client(); |
+ dragging_info_.reset( |
+ [[MockDraggingInfo alloc] initWithPasteboard:pasteboard]); |
+ return client->DragUpdate(dragging_info_.get()); |
+ } |
+ |
+ NSDragOperation Drop(NSPasteboard* pasteboard) { |
tapted
2016/06/01 01:57:01
remove |pasteboard| argument
spqchan
2016/06/01 19:09:28
Done.
|
+ DragDropClientMac* client = drag_drop_client(); |
+ DCHECK(dragging_info_.get()); |
+ NSDragOperation operation = client->Drop(dragging_info_.get()); |
+ dragging_info_.reset(); |
+ return operation; |
+ } |
+ |
+ void SetData(OSExchangeData& data) { |
+ drag_drop_client()->data_source_.reset( |
+ [[CocoaDragDropDataProvider alloc] initWithData:data]); |
+ } |
+ |
+ protected: |
+ Widget* widget_ = nullptr; |
+ BridgedNativeWidget* bridge_ = nullptr; |
+ DragDropView* target_ = nullptr; |
+ base::scoped_nsobject<MockDraggingInfo> dragging_info_; |
+ DISALLOW_COPY_AND_ASSIGN(CocoaDragDropTest); |
tapted
2016/06/01 01:57:01
nit: blank line before, but also this needs to be
spqchan
2016/06/01 19:09:29
Done.
|
+}; |
+ |
+// Tests if the drag and drop target receives the dropped data. |
+TEST_F(CocoaDragDropTest, BasicDragDrop) { |
+ // Create the drop data |
+ OSExchangeData data; |
+ const base::string16& text = ASCIIToUTF16("text"); |
+ data.SetString(text); |
+ SetData(data); |
+ |
+ target_->set_formats(ui::OSExchangeData::STRING | ui::OSExchangeData::URL); |
+ |
+ // Check if the target receives the data from a drop and returns the expected |
+ // operation. |
+ EXPECT_EQ(DragUpdate(nil), NSDragOperationCopy); |
+ EXPECT_EQ(Drop(nil), NSDragOperationMove); |
+} |
+ |
+// Tests if the drag and drop target rejects the dropped data with the |
+// incorrect format. |
+TEST_F(CocoaDragDropTest, InvalidFormatDragDrop) { |
+ OSExchangeData data; |
+ const base::string16& text = ASCIIToUTF16("text"); |
+ data.SetString(text); |
+ SetData(data); |
+ |
+ target_->set_formats(ui::OSExchangeData::URL); |
+ |
+ // Check if the target receives the data from a drop and returns the expected |
+ // operation. |
+ EXPECT_EQ(DragUpdate(nil), NSDragOperationNone); |
+ EXPECT_EQ(Drop(nil), NSDragOperationNone); |
+} |
+ |
+// Tests if the drag and drop target can accept data without an OSExchangeData |
+// object. |
+TEST_F(CocoaDragDropTest, PasteboardToOSExchangeTest) { |
+ target_->set_formats(ui::OSExchangeData::STRING); |
+ |
+ NSPasteboard* pasteboard = [NSPasteboard pasteboardWithUniqueName]; |
+ |
+ EXPECT_EQ(DragUpdate(pasteboard), NSDragOperationNone); |
+ EXPECT_EQ(Drop(pasteboard), NSDragOperationNone); |
+ drag_drop_client()->EndDrag(); |
+ |
+ [pasteboard setString:@"text" forType:NSPasteboardTypeString]; |
+ |
+ EXPECT_EQ(DragUpdate(pasteboard), NSDragOperationCopy); |
+ EXPECT_EQ(Drop(pasteboard), NSDragOperationMove); |
+} |
+ |
+} // namespace test |
+} // namespace views |