web_drag_dest_mac_unittest.mm revision 5821806d5e7f356e8fa4b058a389a808ea183019
1// Copyright (c) 2012 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#include "base/mac/scoped_nsautorelease_pool.h"
6#import "base/memory/scoped_nsobject.h"
7#include "base/sys_string_conversions.h"
8#include "base/utf_string_conversions.h"
9#include "content/browser/renderer_host/test_render_view_host.h"
10#include "content/browser/web_contents/test_web_contents.h"
11#import "content/browser/web_contents/web_drag_dest_mac.h"
12#include "testing/gtest/include/gtest/gtest.h"
13#import "third_party/mozilla/NSPasteboard+Utils.h"
14#import "ui/base/dragdrop/cocoa_dnd_util.h"
15#import "ui/base/test/ui_cocoa_test_helper.h"
16#include "webkit/glue/webdropdata.h"
17
18using content::RenderViewHostImplTestHarness;
19
20namespace {
21NSString* const kCrCorePasteboardFlavorType_url =
22    @"CorePasteboardFlavorType 0x75726C20"; // 'url '  url
23NSString* const kCrCorePasteboardFlavorType_urln =
24    @"CorePasteboardFlavorType 0x75726C6E"; // 'urln'  title
25}  // namespace
26
27class WebDragDestTest : public RenderViewHostImplTestHarness {
28 public:
29  virtual void SetUp() {
30    RenderViewHostImplTestHarness::SetUp();
31    drag_dest_.reset([[WebDragDest alloc] initWithWebContentsImpl:contents()]);
32  }
33
34  void PutURLOnPasteboard(NSString* urlString, NSPasteboard* pboard) {
35    [pboard declareTypes:[NSArray arrayWithObject:NSURLPboardType]
36                   owner:nil];
37    NSURL* url = [NSURL URLWithString:urlString];
38    EXPECT_TRUE(url);
39    [url writeToPasteboard:pboard];
40  }
41
42  void PutCoreURLAndTitleOnPasteboard(NSString* urlString, NSString* title,
43                                      NSPasteboard* pboard) {
44    [pboard
45        declareTypes:[NSArray arrayWithObjects:kCrCorePasteboardFlavorType_url,
46                                               kCrCorePasteboardFlavorType_urln,
47                                               nil]
48               owner:nil];
49    [pboard setString:urlString
50              forType:kCrCorePasteboardFlavorType_url];
51    [pboard setString:title
52              forType:kCrCorePasteboardFlavorType_urln];
53  }
54
55  base::mac::ScopedNSAutoreleasePool pool_;
56  scoped_nsobject<WebDragDest> drag_dest_;
57};
58
59// Make sure nothing leaks.
60TEST_F(WebDragDestTest, Init) {
61  EXPECT_TRUE(drag_dest_);
62}
63
64// Test flipping of coordinates given a point in window coordinates.
65TEST_F(WebDragDestTest, Flip) {
66  NSPoint windowPoint = NSZeroPoint;
67  scoped_nsobject<NSWindow> window([[CocoaTestHelperWindow alloc] init]);
68  NSPoint viewPoint =
69      [drag_dest_ flipWindowPointToView:windowPoint
70                                   view:[window contentView]];
71  NSPoint screenPoint =
72      [drag_dest_ flipWindowPointToScreen:windowPoint
73                                     view:[window contentView]];
74  EXPECT_EQ(0, viewPoint.x);
75  EXPECT_EQ(600, viewPoint.y);
76  EXPECT_EQ(0, screenPoint.x);
77  // We can't put a value on the screen size since everyone will have a
78  // different one.
79  EXPECT_NE(0, screenPoint.y);
80}
81
82TEST_F(WebDragDestTest, URL) {
83  NSPasteboard* pboard = nil;
84  NSString* url = nil;
85  NSString* title = nil;
86  GURL result_url;
87  string16 result_title;
88
89  // Put a URL on the pasteboard and check it.
90  pboard = [NSPasteboard pasteboardWithUniqueName];
91  url = @"http://www.google.com/";
92  PutURLOnPasteboard(url, pboard);
93  EXPECT_TRUE(ui::PopulateURLAndTitleFromPasteboard(
94      &result_url, &result_title, pboard, NO));
95  EXPECT_EQ(base::SysNSStringToUTF8(url), result_url.spec());
96  [pboard releaseGlobally];
97
98  // Put a 'url ' and 'urln' on the pasteboard and check it.
99  pboard = [NSPasteboard pasteboardWithUniqueName];
100  url = @"http://www.google.com/";
101  title = @"Title of Awesomeness!",
102  PutCoreURLAndTitleOnPasteboard(url, title, pboard);
103  EXPECT_TRUE(ui::PopulateURLAndTitleFromPasteboard(
104      &result_url, &result_title, pboard, NO));
105  EXPECT_EQ(base::SysNSStringToUTF8(url), result_url.spec());
106  EXPECT_EQ(base::SysNSStringToUTF16(title), result_title);
107  [pboard releaseGlobally];
108
109  // Also check that it passes file:// via 'url '/'urln' properly.
110  pboard = [NSPasteboard pasteboardWithUniqueName];
111  url = @"file:///tmp/dont_delete_me.txt";
112  title = @"very important";
113  PutCoreURLAndTitleOnPasteboard(url, title, pboard);
114  EXPECT_TRUE(ui::PopulateURLAndTitleFromPasteboard(
115      &result_url, &result_title, pboard, NO));
116  EXPECT_EQ(base::SysNSStringToUTF8(url), result_url.spec());
117  EXPECT_EQ(base::SysNSStringToUTF16(title), result_title);
118  [pboard releaseGlobally];
119
120  // And javascript:.
121  pboard = [NSPasteboard pasteboardWithUniqueName];
122  url = @"javascript:open('http://www.youtube.com/')";
123  title = @"kill some time";
124  PutCoreURLAndTitleOnPasteboard(url, title, pboard);
125  EXPECT_TRUE(ui::PopulateURLAndTitleFromPasteboard(
126      &result_url, &result_title, pboard, NO));
127  EXPECT_EQ(base::SysNSStringToUTF8(url), result_url.spec());
128  EXPECT_EQ(base::SysNSStringToUTF16(title), result_title);
129  [pboard releaseGlobally];
130
131  pboard = [NSPasteboard pasteboardWithUniqueName];
132  url = @"/bin/sh";
133  [pboard declareTypes:[NSArray arrayWithObject:NSFilenamesPboardType]
134                 owner:nil];
135  [pboard setPropertyList:[NSArray arrayWithObject:url]
136                  forType:NSFilenamesPboardType];
137  EXPECT_FALSE(ui::PopulateURLAndTitleFromPasteboard(
138      &result_url, &result_title, pboard, NO));
139  EXPECT_TRUE(ui::PopulateURLAndTitleFromPasteboard(
140      &result_url, &result_title, pboard, YES));
141  EXPECT_EQ("file://localhost/bin/sh", result_url.spec());
142  EXPECT_EQ("sh", UTF16ToUTF8(result_title));
143  [pboard releaseGlobally];
144}
145
146TEST_F(WebDragDestTest, Data) {
147  WebDropData data;
148  NSPasteboard* pboard = [NSPasteboard pasteboardWithUniqueName];
149
150  PutURLOnPasteboard(@"http://www.google.com", pboard);
151  [pboard addTypes:[NSArray arrayWithObjects:NSHTMLPboardType,
152                              NSStringPboardType, nil]
153             owner:nil];
154  NSString* htmlString = @"<html><body><b>hi there</b></body></html>";
155  NSString* textString = @"hi there";
156  [pboard setString:htmlString forType:NSHTMLPboardType];
157  [pboard setString:textString forType:NSStringPboardType];
158  [drag_dest_ populateWebDropData:&data fromPasteboard:pboard];
159  EXPECT_EQ(data.url.spec(), "http://www.google.com/");
160  EXPECT_EQ(base::SysNSStringToUTF16(textString), data.text.string());
161  EXPECT_EQ(base::SysNSStringToUTF16(htmlString), data.html.string());
162
163  [pboard releaseGlobally];
164}
165