Home | History | Annotate | Download | only in dragdrop
      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(&current_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