os_exchange_data_unittest.cc 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  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. #include <memory>
  5. #include "base/files/file_util.h"
  6. #include "base/pickle.h"
  7. #include "base/strings/utf_string_conversions.h"
  8. #include "base/test/task_environment.h"
  9. #include "build/build_config.h"
  10. #include "net/base/filename_util.h"
  11. #include "testing/gtest/include/gtest/gtest.h"
  12. #include "testing/platform_test.h"
  13. #include "ui/base/clipboard/clipboard_format_type.h"
  14. #include "ui/base/clipboard/file_info.h"
  15. #include "ui/base/dragdrop/os_exchange_data.h"
  16. #include "ui/base/dragdrop/os_exchange_data_provider.h"
  17. #include "ui/events/platform/platform_event_source.h"
  18. #include "url/gurl.h"
  19. #if BUILDFLAG(IS_MAC)
  20. #include "base/mac/mac_util.h"
  21. #endif
  22. namespace ui {
  23. class OSExchangeDataTest : public PlatformTest {
  24. public:
  25. OSExchangeDataTest()
  26. : task_environment_(base::test::TaskEnvironment::MainThreadType::UI),
  27. event_source_(PlatformEventSource::CreateDefault()) {}
  28. private:
  29. base::test::TaskEnvironment task_environment_;
  30. std::unique_ptr<PlatformEventSource> event_source_;
  31. };
  32. TEST_F(OSExchangeDataTest, StringDataGetAndSet) {
  33. OSExchangeData data;
  34. std::u16string input = u"I can has cheezburger?";
  35. EXPECT_FALSE(data.HasString());
  36. data.SetString(input);
  37. EXPECT_TRUE(data.HasString());
  38. OSExchangeData data2(
  39. std::unique_ptr<OSExchangeDataProvider>(data.provider().Clone()));
  40. std::u16string output;
  41. EXPECT_TRUE(data2.HasString());
  42. EXPECT_TRUE(data2.GetString(&output));
  43. EXPECT_EQ(input, output);
  44. std::string url_spec = "http://www.goats.com/";
  45. GURL url(url_spec);
  46. std::u16string title;
  47. EXPECT_FALSE(data2.GetURLAndTitle(
  48. FilenameToURLPolicy::DO_NOT_CONVERT_FILENAMES, &url, &title));
  49. // No URLs in |data|, so url should be untouched.
  50. EXPECT_EQ(url_spec, url.spec());
  51. }
  52. TEST_F(OSExchangeDataTest, TestURLExchangeFormats) {
  53. OSExchangeData data;
  54. std::string url_spec = "http://www.google.com/";
  55. GURL url(url_spec);
  56. std::u16string url_title = u"www.google.com";
  57. EXPECT_FALSE(data.HasURL(FilenameToURLPolicy::DO_NOT_CONVERT_FILENAMES));
  58. data.SetURL(url, url_title);
  59. EXPECT_TRUE(data.HasURL(FilenameToURLPolicy::DO_NOT_CONVERT_FILENAMES));
  60. OSExchangeData data2(
  61. std::unique_ptr<OSExchangeDataProvider>(data.provider().Clone()));
  62. // URL spec and title should match
  63. GURL output_url;
  64. std::u16string output_title;
  65. EXPECT_TRUE(data2.HasURL(FilenameToURLPolicy::DO_NOT_CONVERT_FILENAMES));
  66. EXPECT_TRUE(
  67. data2.GetURLAndTitle(FilenameToURLPolicy::DO_NOT_CONVERT_FILENAMES,
  68. &output_url, &output_title));
  69. EXPECT_EQ(url_spec, output_url.spec());
  70. EXPECT_EQ(url_title, output_title);
  71. std::u16string output_string;
  72. // URL should be the raw text response
  73. EXPECT_TRUE(data2.GetString(&output_string));
  74. EXPECT_EQ(url_spec, base::UTF16ToUTF8(output_string));
  75. }
  76. // Test that setting the URL does not overwrite a previously set custom string
  77. // and that the synthesized URL shortcut file is ignored by GetFileContents().
  78. TEST_F(OSExchangeDataTest, URLStringFileContents) {
  79. OSExchangeData data;
  80. std::u16string string = u"I can has cheezburger?";
  81. data.SetString(string);
  82. std::string url_spec = "http://www.google.com/";
  83. GURL url(url_spec);
  84. std::u16string url_title = u"www.google.com";
  85. data.SetURL(url, url_title);
  86. std::u16string output_string;
  87. EXPECT_TRUE(data.GetString(&output_string));
  88. EXPECT_EQ(string, output_string);
  89. GURL output_url;
  90. std::u16string output_title;
  91. EXPECT_TRUE(data.GetURLAndTitle(FilenameToURLPolicy::DO_NOT_CONVERT_FILENAMES,
  92. &output_url, &output_title));
  93. EXPECT_EQ(url_spec, output_url.spec());
  94. EXPECT_EQ(url_title, output_title);
  95. // HasFileContents() should be false, and GetFileContents() should be empty
  96. // (https://crbug.com/1274395).
  97. EXPECT_FALSE(data.HasFileContents());
  98. base::FilePath filename;
  99. std::string contents;
  100. EXPECT_FALSE(data.GetFileContents(&filename, &contents));
  101. EXPECT_TRUE(filename.empty());
  102. EXPECT_TRUE(contents.empty());
  103. }
  104. TEST_F(OSExchangeDataTest, TestFileToURLConversion) {
  105. OSExchangeData data;
  106. EXPECT_FALSE(data.HasURL(FilenameToURLPolicy::DO_NOT_CONVERT_FILENAMES));
  107. EXPECT_FALSE(data.HasURL(FilenameToURLPolicy::CONVERT_FILENAMES));
  108. EXPECT_FALSE(data.HasFile());
  109. base::FilePath current_directory;
  110. ASSERT_TRUE(base::GetCurrentDirectory(&current_directory));
  111. data.SetFilename(current_directory);
  112. {
  113. EXPECT_FALSE(data.HasURL(FilenameToURLPolicy::DO_NOT_CONVERT_FILENAMES));
  114. GURL actual_url;
  115. std::u16string actual_title;
  116. EXPECT_FALSE(
  117. data.GetURLAndTitle(FilenameToURLPolicy::DO_NOT_CONVERT_FILENAMES,
  118. &actual_url, &actual_title));
  119. EXPECT_EQ(GURL(), actual_url);
  120. EXPECT_EQ(std::u16string(), actual_title);
  121. }
  122. {
  123. EXPECT_TRUE(data.HasURL(FilenameToURLPolicy::CONVERT_FILENAMES));
  124. GURL actual_url;
  125. std::u16string actual_title;
  126. EXPECT_TRUE(data.GetURLAndTitle(FilenameToURLPolicy::CONVERT_FILENAMES,
  127. &actual_url, &actual_title));
  128. // Some Mac OS versions return the URL in file://localhost form instead
  129. // of file:///, so we compare the url's path not its absolute string.
  130. EXPECT_EQ(net::FilePathToFileURL(current_directory).path(),
  131. actual_url.path());
  132. EXPECT_EQ(std::u16string(), actual_title);
  133. }
  134. EXPECT_TRUE(data.HasFile());
  135. base::FilePath actual_path;
  136. EXPECT_TRUE(data.GetFilename(&actual_path));
  137. EXPECT_EQ(current_directory, actual_path);
  138. }
  139. TEST_F(OSExchangeDataTest, TestPickledData) {
  140. const ClipboardFormatType kTestFormat =
  141. ClipboardFormatType::GetType("application/vnd.chromium.test");
  142. base::Pickle saved_pickle;
  143. saved_pickle.WriteInt(1);
  144. saved_pickle.WriteInt(2);
  145. OSExchangeData data;
  146. data.SetPickledData(kTestFormat, saved_pickle);
  147. OSExchangeData copy(
  148. std::unique_ptr<OSExchangeDataProvider>(data.provider().Clone()));
  149. EXPECT_TRUE(copy.HasCustomFormat(kTestFormat));
  150. base::Pickle restored_pickle;
  151. EXPECT_TRUE(copy.GetPickledData(kTestFormat, &restored_pickle));
  152. base::PickleIterator iterator(restored_pickle);
  153. int value;
  154. EXPECT_TRUE(iterator.ReadInt(&value));
  155. EXPECT_EQ(1, value);
  156. EXPECT_TRUE(iterator.ReadInt(&value));
  157. EXPECT_EQ(2, value);
  158. }
  159. TEST_F(OSExchangeDataTest, TestFilenames) {
  160. #if BUILDFLAG(IS_WIN)
  161. const std::vector<FileInfo> kTestFilenames = {
  162. {base::FilePath(FILE_PATH_LITERAL("C:\\tmp\\test_file1")),
  163. base::FilePath()},
  164. {base::FilePath(FILE_PATH_LITERAL("C:\\tmp\\test_file2")),
  165. base::FilePath()},
  166. };
  167. #else
  168. const std::vector<FileInfo> kTestFilenames = {
  169. {base::FilePath(FILE_PATH_LITERAL("/tmp/test_file1")), base::FilePath()},
  170. {base::FilePath(FILE_PATH_LITERAL("/tmp/test_file2")), base::FilePath()},
  171. };
  172. #endif
  173. OSExchangeData data;
  174. data.SetFilenames(kTestFilenames);
  175. OSExchangeData copy(data.provider().Clone());
  176. std::vector<FileInfo> dropped_filenames;
  177. EXPECT_TRUE(copy.GetFilenames(&dropped_filenames));
  178. EXPECT_EQ(kTestFilenames, dropped_filenames);
  179. }
  180. #if defined(USE_AURA)
  181. TEST_F(OSExchangeDataTest, TestHTML) {
  182. OSExchangeData data;
  183. GURL url("http://www.google.com/");
  184. std::u16string html =
  185. u"<HTML>\n<BODY>\n"
  186. u"<b>bold.</b> <i><b>This is bold italic.</b></i>\n"
  187. u"</BODY>\n</HTML>";
  188. data.SetHtml(html, url);
  189. OSExchangeData copy(
  190. std::unique_ptr<OSExchangeDataProvider>(data.provider().Clone()));
  191. std::u16string read_html;
  192. EXPECT_TRUE(copy.HasHtml());
  193. EXPECT_TRUE(copy.GetHtml(&read_html, &url));
  194. EXPECT_EQ(html, read_html);
  195. }
  196. #endif
  197. } // namespace ui