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

Unified Diff: ui/views/cocoa/desktop_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: Created 4 years, 7 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: 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..6385e00afd2364dc1dd64e5375ae54f3b964215d
--- /dev/null
+++ b/ui/views/cocoa/desktop_drag_drop_client_mac_unittest.mm
@@ -0,0 +1,248 @@
+// 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_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/widget.h"
+
+using base::ASCIIToUTF16;
+
+// Mocks the NSDraggingInfo sent to the DragDropClientMac's DragUpdate() and
+// Drop() methods. Out of the required methods of the protocol, 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; }
+
+ // View:
+ 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 {
tapted 2016/06/02 00:24:51 oops - we should name this class to be consistent
spqchan 2016/06/02 22:01:19 Done.
+ public:
+ CocoaDragDropTest() : widget_(new Widget) {}
+
+ DragDropClientMac* drag_drop_client() { return bridge_->drag_drop_client(); }
+
+ NSDragOperation DragUpdate(NSPasteboard* pasteboard) {
+ DragDropClientMac* client = drag_drop_client();
+ dragging_info_.reset(
+ [[MockDraggingInfo alloc] initWithPasteboard:pasteboard]);
+ return client->DragUpdate(dragging_info_.get());
+ }
+
+ NSDragOperation Drop() {
+ 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]);
+ }
+
+ // testing::Test:
+ 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();
+ }
+
+ protected:
+ Widget* widget_ = nullptr;
+ BridgedNativeWidget* bridge_ = nullptr;
+ DragDropView* target_ = nullptr;
+ base::scoped_nsobject<MockDraggingInfo> dragging_info_;
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(CocoaDragDropTest);
+};
+
+// 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(), 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(), 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];
+
+ // The test should reject the data if the pasteboard is empty.
+ EXPECT_EQ(DragUpdate(pasteboard), NSDragOperationNone);
+ EXPECT_EQ(Drop(), NSDragOperationNone);
+ drag_drop_client()->EndDrag();
+
+ // Add valid data to the pasteboard and check to see if the target accepts
+ // it.
+ [pasteboard setString:@"text" forType:NSPasteboardTypeString];
+ EXPECT_EQ(DragUpdate(pasteboard), NSDragOperationCopy);
+ EXPECT_EQ(Drop(), NSDragOperationMove);
+}
+
+} // namespace test
+} // namespace views

Powered by Google App Engine
This is Rietveld 408576698