1 // Copyright 2013 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/files/file_util.h" 6 #include "base/message_loop/message_loop.h" 7 #include "base/pickle.h" 8 #include "base/strings/utf_string_conversions.h" 9 #include "net/base/filename_util.h" 10 #include "testing/gtest/include/gtest/gtest.h" 11 #include "testing/platform_test.h" 12 #include "ui/base/dragdrop/os_exchange_data.h" 13 #include "ui/events/platform/platform_event_source.h" 14 #include "url/gurl.h" 15 16 namespace ui { 17 18 class OSExchangeDataTest : public PlatformTest { 19 public: 20 OSExchangeDataTest() 21 : event_source_(ui::PlatformEventSource::CreateDefault()) {} 22 23 private: 24 base::MessageLoopForUI message_loop_; 25 scoped_ptr<PlatformEventSource> event_source_; 26 }; 27 28 TEST_F(OSExchangeDataTest, StringDataGetAndSet) { 29 OSExchangeData data; 30 base::string16 input = base::ASCIIToUTF16("I can has cheezburger?"); 31 EXPECT_FALSE(data.HasString()); 32 data.SetString(input); 33 EXPECT_TRUE(data.HasString()); 34 35 OSExchangeData data2(data.provider().Clone()); 36 base::string16 output; 37 EXPECT_TRUE(data2.HasString()); 38 EXPECT_TRUE(data2.GetString(&output)); 39 EXPECT_EQ(input, output); 40 std::string url_spec = "http://www.goats.com/"; 41 GURL url(url_spec); 42 base::string16 title; 43 EXPECT_FALSE(data2.GetURLAndTitle( 44 OSExchangeData::DO_NOT_CONVERT_FILENAMES, &url, &title)); 45 // No URLs in |data|, so url should be untouched. 46 EXPECT_EQ(url_spec, url.spec()); 47 } 48 49 TEST_F(OSExchangeDataTest, TestURLExchangeFormats) { 50 OSExchangeData data; 51 std::string url_spec = "http://www.google.com/"; 52 GURL url(url_spec); 53 base::string16 url_title = base::ASCIIToUTF16("www.google.com"); 54 EXPECT_FALSE(data.HasURL(OSExchangeData::DO_NOT_CONVERT_FILENAMES)); 55 data.SetURL(url, url_title); 56 EXPECT_TRUE(data.HasURL(OSExchangeData::DO_NOT_CONVERT_FILENAMES)); 57 58 OSExchangeData data2(data.provider().Clone()); 59 60 // URL spec and title should match 61 GURL output_url; 62 base::string16 output_title; 63 EXPECT_TRUE(data2.HasURL(OSExchangeData::DO_NOT_CONVERT_FILENAMES)); 64 EXPECT_TRUE(data2.GetURLAndTitle( 65 OSExchangeData::DO_NOT_CONVERT_FILENAMES, &output_url, &output_title)); 66 EXPECT_EQ(url_spec, output_url.spec()); 67 EXPECT_EQ(url_title, output_title); 68 base::string16 output_string; 69 70 // URL should be the raw text response 71 EXPECT_TRUE(data2.GetString(&output_string)); 72 EXPECT_EQ(url_spec, base::UTF16ToUTF8(output_string)); 73 } 74 75 // Test that setting the URL does not overwrite a previously set custom string. 76 TEST_F(OSExchangeDataTest, URLAndString) { 77 OSExchangeData data; 78 base::string16 string = base::ASCIIToUTF16("I can has cheezburger?"); 79 data.SetString(string); 80 std::string url_spec = "http://www.google.com/"; 81 GURL url(url_spec); 82 base::string16 url_title = base::ASCIIToUTF16("www.google.com"); 83 data.SetURL(url, url_title); 84 85 base::string16 output_string; 86 EXPECT_TRUE(data.GetString(&output_string)); 87 EXPECT_EQ(string, output_string); 88 89 GURL output_url; 90 base::string16 output_title; 91 EXPECT_TRUE(data.GetURLAndTitle( 92 OSExchangeData::DO_NOT_CONVERT_FILENAMES, &output_url, &output_title)); 93 EXPECT_EQ(url_spec, output_url.spec()); 94 EXPECT_EQ(url_title, output_title); 95 } 96 97 TEST_F(OSExchangeDataTest, TestFileToURLConversion) { 98 OSExchangeData data; 99 EXPECT_FALSE(data.HasURL(OSExchangeData::DO_NOT_CONVERT_FILENAMES)); 100 EXPECT_FALSE(data.HasURL(OSExchangeData::CONVERT_FILENAMES)); 101 EXPECT_FALSE(data.HasFile()); 102 103 base::FilePath current_directory; 104 ASSERT_TRUE(base::GetCurrentDirectory(¤t_directory)); 105 106 data.SetFilename(current_directory); 107 108 { 109 EXPECT_FALSE(data.HasURL(OSExchangeData::DO_NOT_CONVERT_FILENAMES)); 110 GURL actual_url; 111 base::string16 actual_title; 112 EXPECT_FALSE(data.GetURLAndTitle( 113 OSExchangeData::DO_NOT_CONVERT_FILENAMES, &actual_url, &actual_title)); 114 EXPECT_EQ(GURL(), actual_url); 115 EXPECT_EQ(base::string16(), actual_title); 116 } 117 118 { 119 // Filename to URL conversion is not implemented on ChromeOS or on non-X11 Linux 120 // builds. 121 #if defined(OS_CHROMEOS) || (defined(OS_LINUX) && !defined(USE_X11)) 122 const bool expected_success = false; 123 const GURL expected_url; 124 #else 125 const bool expected_success = true; 126 const GURL expected_url(net::FilePathToFileURL(current_directory)); 127 #endif 128 EXPECT_EQ(expected_success, data.HasURL(OSExchangeData::CONVERT_FILENAMES)); 129 GURL actual_url; 130 base::string16 actual_title; 131 EXPECT_EQ( 132 expected_success, 133 data.GetURLAndTitle( 134 OSExchangeData::CONVERT_FILENAMES, &actual_url, &actual_title)); 135 // Some Mac OS versions return the URL in file://localhost form instead 136 // of file:///, so we compare the url's path not its absolute string. 137 EXPECT_EQ(expected_url.path(), actual_url.path()); 138 EXPECT_EQ(base::string16(), actual_title); 139 } 140 EXPECT_TRUE(data.HasFile()); 141 base::FilePath actual_path; 142 EXPECT_TRUE(data.GetFilename(&actual_path)); 143 EXPECT_EQ(current_directory, actual_path); 144 } 145 146 TEST_F(OSExchangeDataTest, TestPickledData) { 147 const OSExchangeData::CustomFormat kTestFormat = 148 ui::Clipboard::GetFormatType("application/vnd.chromium.test"); 149 150 Pickle saved_pickle; 151 saved_pickle.WriteInt(1); 152 saved_pickle.WriteInt(2); 153 OSExchangeData data; 154 data.SetPickledData(kTestFormat, saved_pickle); 155 156 OSExchangeData copy(data.provider().Clone()); 157 EXPECT_TRUE(copy.HasCustomFormat(kTestFormat)); 158 159 Pickle restored_pickle; 160 EXPECT_TRUE(copy.GetPickledData(kTestFormat, &restored_pickle)); 161 PickleIterator iterator(restored_pickle); 162 int value; 163 EXPECT_TRUE(restored_pickle.ReadInt(&iterator, &value)); 164 EXPECT_EQ(1, value); 165 EXPECT_TRUE(restored_pickle.ReadInt(&iterator, &value)); 166 EXPECT_EQ(2, value); 167 } 168 169 #if defined(USE_AURA) 170 TEST_F(OSExchangeDataTest, TestHTML) { 171 OSExchangeData data; 172 GURL url("http://www.google.com/"); 173 base::string16 html = base::ASCIIToUTF16( 174 "<HTML>\n<BODY>\n" 175 "<b>bold.</b> <i><b>This is bold italic.</b></i>\n" 176 "</BODY>\n</HTML>"); 177 data.SetHtml(html, url); 178 179 OSExchangeData copy(data.provider().Clone()); 180 base::string16 read_html; 181 EXPECT_TRUE(copy.GetHtml(&read_html, &url)); 182 EXPECT_EQ(html, read_html); 183 } 184 #endif 185 186 } // namespace ui 187