Home | History | Annotate | Download | only in clipboard
      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 "build/build_config.h"
      6 
      7 #include <string>
      8 
      9 #include "base/basictypes.h"
     10 #include "base/memory/scoped_ptr.h"
     11 #include "base/message_loop/message_loop.h"
     12 #include "base/pickle.h"
     13 #include "base/strings/string_util.h"
     14 #include "base/strings/utf_string_conversions.h"
     15 #include "testing/gtest/include/gtest/gtest.h"
     16 #include "testing/platform_test.h"
     17 #include "third_party/skia/include/core/SkBitmap.h"
     18 #include "ui/base/clipboard/clipboard.h"
     19 #include "ui/base/clipboard/scoped_clipboard_writer.h"
     20 #include "ui/gfx/size.h"
     21 
     22 #if defined(OS_WIN)
     23 #include "ui/base/clipboard/clipboard_util_win.h"
     24 #endif
     25 
     26 #if defined(OS_ANDROID)
     27 #include "base/android/jni_android.h"
     28 #include "base/android/jni_string.h"
     29 #endif
     30 
     31 namespace ui {
     32 
     33 class ClipboardTest : public PlatformTest {
     34  protected:
     35   Clipboard& clipboard() { return clipboard_; }
     36 
     37  private:
     38   base::MessageLoopForUI message_loop_;
     39   Clipboard clipboard_;
     40 };
     41 
     42 namespace {
     43 
     44 bool MarkupMatches(const string16& expected_markup,
     45                    const string16& actual_markup) {
     46   return actual_markup.find(expected_markup) != string16::npos;
     47 }
     48 
     49 }  // namespace
     50 
     51 TEST_F(ClipboardTest, ClearTest) {
     52   {
     53     ScopedClipboardWriter clipboard_writer(&clipboard(),
     54                                            Clipboard::BUFFER_STANDARD);
     55     clipboard_writer.WriteText(ASCIIToUTF16("clear me"));
     56   }
     57 
     58   clipboard().Clear(Clipboard::BUFFER_STANDARD);
     59 
     60   EXPECT_FALSE(clipboard().IsFormatAvailable(
     61       Clipboard::GetPlainTextWFormatType(), Clipboard::BUFFER_STANDARD));
     62   EXPECT_FALSE(clipboard().IsFormatAvailable(
     63       Clipboard::GetPlainTextFormatType(), Clipboard::BUFFER_STANDARD));
     64 }
     65 
     66 TEST_F(ClipboardTest, TextTest) {
     67   string16 text(ASCIIToUTF16("This is a string16!#$")), text_result;
     68   std::string ascii_text;
     69 
     70   {
     71     ScopedClipboardWriter clipboard_writer(&clipboard(),
     72                                            Clipboard::BUFFER_STANDARD);
     73     clipboard_writer.WriteText(text);
     74   }
     75 
     76   EXPECT_TRUE(clipboard().IsFormatAvailable(
     77       Clipboard::GetPlainTextWFormatType(), Clipboard::BUFFER_STANDARD));
     78   EXPECT_TRUE(clipboard().IsFormatAvailable(Clipboard::GetPlainTextFormatType(),
     79                                             Clipboard::BUFFER_STANDARD));
     80   clipboard().ReadText(Clipboard::BUFFER_STANDARD, &text_result);
     81 
     82   EXPECT_EQ(text, text_result);
     83   clipboard().ReadAsciiText(Clipboard::BUFFER_STANDARD, &ascii_text);
     84   EXPECT_EQ(UTF16ToUTF8(text), ascii_text);
     85 }
     86 
     87 TEST_F(ClipboardTest, HTMLTest) {
     88   string16 markup(ASCIIToUTF16("<string>Hi!</string>")), markup_result;
     89   std::string url("http://www.example.com/"), url_result;
     90 
     91   {
     92     ScopedClipboardWriter clipboard_writer(&clipboard(),
     93                                            Clipboard::BUFFER_STANDARD);
     94     clipboard_writer.WriteHTML(markup, url);
     95   }
     96 
     97   EXPECT_TRUE(clipboard().IsFormatAvailable(Clipboard::GetHtmlFormatType(),
     98                                             Clipboard::BUFFER_STANDARD));
     99   uint32 ignored;
    100   clipboard().ReadHTML(Clipboard::BUFFER_STANDARD, &markup_result, &url_result,
    101                      &ignored, &ignored);
    102   EXPECT_PRED2(MarkupMatches, markup, markup_result);
    103 #if defined(OS_WIN)
    104   // TODO(playmobil): It's not clear that non windows clipboards need to support
    105   // this.
    106   EXPECT_EQ(url, url_result);
    107 #endif  // defined(OS_WIN)
    108 }
    109 
    110 TEST_F(ClipboardTest, RTFTest) {
    111   std::string rtf =
    112       "{\\rtf1\\ansi{\\fonttbl\\f0\\fswiss Helvetica;}\\f0\\pard\n"
    113       "This is some {\\b bold} text.\\par\n"
    114       "}";
    115 
    116   {
    117     ScopedClipboardWriter clipboard_writer(&clipboard(),
    118                                            Clipboard::BUFFER_STANDARD);
    119     clipboard_writer.WriteRTF(rtf);
    120   }
    121 
    122   EXPECT_TRUE(clipboard().IsFormatAvailable(Clipboard::GetRtfFormatType(),
    123                                             Clipboard::BUFFER_STANDARD));
    124   std::string result;
    125   clipboard().ReadRTF(Clipboard::BUFFER_STANDARD, &result);
    126   EXPECT_EQ(rtf, result);
    127 }
    128 
    129 #if defined(TOOLKIT_GTK)
    130 TEST_F(ClipboardTest, MultipleBufferTest) {
    131   string16 text(ASCIIToUTF16("Standard")), text_result;
    132   string16 markup(ASCIIToUTF16("<string>Selection</string>")), markup_result;
    133   std::string url("http://www.example.com/"), url_result;
    134 
    135   {
    136     ScopedClipboardWriter clipboard_writer(&clipboard(),
    137                                            Clipboard::BUFFER_STANDARD);
    138     clipboard_writer.WriteText(text);
    139   }
    140 
    141   {
    142     ScopedClipboardWriter clipboard_writer(&clipboard(),
    143                                            Clipboard::BUFFER_SELECTION);
    144     clipboard_writer.WriteHTML(markup, url);
    145   }
    146 
    147   EXPECT_TRUE(clipboard().IsFormatAvailable(Clipboard::GetPlainTextFormatType(),
    148                                             Clipboard::BUFFER_STANDARD));
    149   EXPECT_FALSE(clipboard().IsFormatAvailable(
    150       Clipboard::GetPlainTextFormatType(),
    151       Clipboard::BUFFER_SELECTION));
    152 
    153   EXPECT_FALSE(clipboard().IsFormatAvailable(Clipboard::GetHtmlFormatType(),
    154                                              Clipboard::BUFFER_STANDARD));
    155   EXPECT_TRUE(clipboard().IsFormatAvailable(Clipboard::GetHtmlFormatType(),
    156                                             Clipboard::BUFFER_SELECTION));
    157 
    158   clipboard().ReadText(Clipboard::BUFFER_STANDARD, &text_result);
    159   EXPECT_EQ(text, text_result);
    160 
    161   uint32 ignored;
    162   clipboard().ReadHTML(Clipboard::BUFFER_SELECTION, &markup_result, &url_result,
    163                        &ignored, &ignored);
    164   EXPECT_PRED2(MarkupMatches, markup, markup_result);
    165 }
    166 #endif
    167 
    168 TEST_F(ClipboardTest, TrickyHTMLTest) {
    169   string16 markup(ASCIIToUTF16("<em>Bye!<!--EndFragment --></em>")),
    170       markup_result;
    171   std::string url, url_result;
    172 
    173   {
    174     ScopedClipboardWriter clipboard_writer(&clipboard(),
    175                                            Clipboard::BUFFER_STANDARD);
    176     clipboard_writer.WriteHTML(markup, url);
    177   }
    178 
    179   EXPECT_TRUE(clipboard().IsFormatAvailable(Clipboard::GetHtmlFormatType(),
    180                                             Clipboard::BUFFER_STANDARD));
    181   uint32 ignored;
    182   clipboard().ReadHTML(Clipboard::BUFFER_STANDARD, &markup_result, &url_result,
    183                        &ignored, &ignored);
    184   EXPECT_PRED2(MarkupMatches, markup, markup_result);
    185 #if defined(OS_WIN)
    186   // TODO(playmobil): It's not clear that non windows clipboards need to support
    187   // this.
    188   EXPECT_EQ(url, url_result);
    189 #endif  // defined(OS_WIN)
    190 }
    191 
    192 #if defined(OS_WIN)
    193 TEST_F(ClipboardTest, UniodeHTMLTest) {
    194   string16 markup(UTF8ToUTF16("<div>A \xc3\xb8 \xe6\xb0\xb4</div>")),
    195       markup_result;
    196   std::string url, url_result;
    197 
    198   {
    199     ScopedClipboardWriter clipboard_writer(&clipboard(),
    200                                            Clipboard::BUFFER_STANDARD);
    201     clipboard_writer.WriteHTML(markup, url);
    202   }
    203 
    204   EXPECT_TRUE(clipboard().IsFormatAvailable(Clipboard::GetHtmlFormatType(),
    205                                             Clipboard::BUFFER_STANDARD));
    206   uint32 fragment_start;
    207   uint32 fragment_end;
    208   clipboard().ReadHTML(Clipboard::BUFFER_STANDARD, &markup_result, &url_result,
    209                        &fragment_start, &fragment_end);
    210   EXPECT_PRED2(MarkupMatches, markup, markup_result);
    211   EXPECT_EQ(url, url_result);
    212   // Make sure that fragment indices were adjusted when converting.
    213   EXPECT_EQ(36, fragment_start);
    214   EXPECT_EQ(52, fragment_end);
    215 }
    216 #endif  // defined(OS_WIN)
    217 
    218 #if defined(TOOLKIT_GTK)
    219 // Regression test for crbug.com/56298 (pasting empty HTML crashes Linux).
    220 TEST_F(ClipboardTest, EmptyHTMLTest) {
    221   // ScopedClipboardWriter doesn't let us write empty data to the clipboard.
    222   clipboard().clipboard_data_ = new Clipboard::TargetMap();
    223   // The 1 is so the compiler doesn't warn about allocating an empty array.
    224   char* empty = new char[1];
    225   clipboard().InsertMapping("text/html", empty, 0U);
    226   clipboard().SetGtkClipboard(Clipboard::BUFFER_STANDARD);
    227 
    228   EXPECT_TRUE(clipboard().IsFormatAvailable(Clipboard::GetHtmlFormatType(),
    229                                             Clipboard::BUFFER_STANDARD));
    230   string16 markup_result;
    231   std::string url_result;
    232   uint32 ignored;
    233   clipboard().ReadHTML(Clipboard::BUFFER_STANDARD, &markup_result, &url_result,
    234                        &ignored, &ignored);
    235   EXPECT_PRED2(MarkupMatches, string16(), markup_result);
    236 }
    237 #endif
    238 
    239 // TODO(estade): Port the following test (decide what target we use for urls)
    240 #if !defined(OS_POSIX) || defined(OS_MACOSX)
    241 TEST_F(ClipboardTest, BookmarkTest) {
    242   string16 title(ASCIIToUTF16("The Example Company")), title_result;
    243   std::string url("http://www.example.com/"), url_result;
    244 
    245   {
    246     ScopedClipboardWriter clipboard_writer(&clipboard(),
    247                                            Clipboard::BUFFER_STANDARD);
    248     clipboard_writer.WriteBookmark(title, url);
    249   }
    250 
    251   EXPECT_TRUE(clipboard().IsFormatAvailable(Clipboard::GetUrlWFormatType(),
    252                                             Clipboard::BUFFER_STANDARD));
    253   clipboard().ReadBookmark(&title_result, &url_result);
    254   EXPECT_EQ(title, title_result);
    255   EXPECT_EQ(url, url_result);
    256 }
    257 #endif  // defined(OS_WIN)
    258 
    259 TEST_F(ClipboardTest, MultiFormatTest) {
    260   string16 text(ASCIIToUTF16("Hi!")), text_result;
    261   string16 markup(ASCIIToUTF16("<strong>Hi!</string>")), markup_result;
    262   std::string url("http://www.example.com/"), url_result;
    263   std::string ascii_text;
    264 
    265   {
    266     ScopedClipboardWriter clipboard_writer(&clipboard(),
    267                                            Clipboard::BUFFER_STANDARD);
    268     clipboard_writer.WriteHTML(markup, url);
    269     clipboard_writer.WriteText(text);
    270   }
    271 
    272   EXPECT_TRUE(clipboard().IsFormatAvailable(Clipboard::GetHtmlFormatType(),
    273                                             Clipboard::BUFFER_STANDARD));
    274   EXPECT_TRUE(clipboard().IsFormatAvailable(
    275       Clipboard::GetPlainTextWFormatType(), Clipboard::BUFFER_STANDARD));
    276   EXPECT_TRUE(clipboard().IsFormatAvailable(
    277       Clipboard::GetPlainTextFormatType(), Clipboard::BUFFER_STANDARD));
    278   uint32 ignored;
    279   clipboard().ReadHTML(Clipboard::BUFFER_STANDARD, &markup_result, &url_result,
    280                        &ignored, &ignored);
    281   EXPECT_PRED2(MarkupMatches, markup, markup_result);
    282 #if defined(OS_WIN)
    283   // TODO(playmobil): It's not clear that non windows clipboards need to support
    284   // this.
    285   EXPECT_EQ(url, url_result);
    286 #endif  // defined(OS_WIN)
    287   clipboard().ReadText(Clipboard::BUFFER_STANDARD, &text_result);
    288   EXPECT_EQ(text, text_result);
    289   clipboard().ReadAsciiText(Clipboard::BUFFER_STANDARD, &ascii_text);
    290   EXPECT_EQ(UTF16ToUTF8(text), ascii_text);
    291 }
    292 
    293 TEST_F(ClipboardTest, URLTest) {
    294   string16 url(ASCIIToUTF16("http://www.google.com/"));
    295 
    296   {
    297     ScopedClipboardWriter clipboard_writer(&clipboard(),
    298                                            Clipboard::BUFFER_STANDARD);
    299     clipboard_writer.WriteURL(url);
    300   }
    301 
    302   EXPECT_TRUE(clipboard().IsFormatAvailable(
    303       Clipboard::GetPlainTextWFormatType(), Clipboard::BUFFER_STANDARD));
    304   EXPECT_TRUE(clipboard().IsFormatAvailable(Clipboard::GetPlainTextFormatType(),
    305                                             Clipboard::BUFFER_STANDARD));
    306   string16 text_result;
    307   clipboard().ReadText(Clipboard::BUFFER_STANDARD, &text_result);
    308 
    309   EXPECT_EQ(text_result, url);
    310 
    311   std::string ascii_text;
    312   clipboard().ReadAsciiText(Clipboard::BUFFER_STANDARD, &ascii_text);
    313   EXPECT_EQ(UTF16ToUTF8(url), ascii_text);
    314 
    315 #if defined(OS_POSIX) && !defined(OS_MACOSX) && !defined(OS_ANDROID)
    316   ascii_text.clear();
    317   clipboard().ReadAsciiText(Clipboard::BUFFER_SELECTION, &ascii_text);
    318   EXPECT_EQ(UTF16ToUTF8(url), ascii_text);
    319 #endif
    320 }
    321 
    322 // TODO(erg): Reenable this everywhere once linux_aura learns what bitmaps are.
    323 #if !(defined(USE_AURA) && !defined(OS_CHROMEOS))
    324 TEST_F(ClipboardTest, SharedBitmapTest) {
    325   unsigned int fake_bitmap[] = {
    326     0x46155189, 0xF6A55C8D, 0x79845674, 0xFA57BD89,
    327     0x78FD46AE, 0x87C64F5A, 0x36EDC5AF, 0x4378F568,
    328     0x91E9F63A, 0xC31EA14F, 0x69AB32DF, 0x643A3FD1,
    329   };
    330   gfx::Size fake_bitmap_size(3, 4);
    331   uint32 bytes = sizeof(fake_bitmap);
    332 
    333   // Create shared memory region.
    334   base::SharedMemory shared_buf;
    335   ASSERT_TRUE(shared_buf.CreateAndMapAnonymous(bytes));
    336   memcpy(shared_buf.memory(), fake_bitmap, bytes);
    337   base::SharedMemoryHandle handle_to_share;
    338   base::ProcessHandle current_process = base::kNullProcessHandle;
    339 #if defined(OS_WIN)
    340   current_process = GetCurrentProcess();
    341 #endif
    342   shared_buf.ShareToProcess(current_process, &handle_to_share);
    343   ASSERT_TRUE(shared_buf.Unmap());
    344 
    345   // Setup data for clipboard().
    346   Clipboard::ObjectMapParam placeholder_param;
    347   Clipboard::ObjectMapParam size_param;
    348   const char* size_data = reinterpret_cast<const char*>(&fake_bitmap_size);
    349   for (size_t i = 0; i < sizeof(fake_bitmap_size); ++i)
    350     size_param.push_back(size_data[i]);
    351 
    352   Clipboard::ObjectMapParams params;
    353   params.push_back(placeholder_param);
    354   params.push_back(size_param);
    355 
    356   Clipboard::ObjectMap objects;
    357   objects[Clipboard::CBF_SMBITMAP] = params;
    358   Clipboard::ReplaceSharedMemHandle(&objects, handle_to_share, current_process);
    359 
    360   clipboard().WriteObjects(Clipboard::BUFFER_STANDARD,
    361                            objects);
    362 
    363   EXPECT_TRUE(clipboard().IsFormatAvailable(Clipboard::GetBitmapFormatType(),
    364                                             Clipboard::BUFFER_STANDARD));
    365 }
    366 #endif
    367 
    368 // The following test somehow fails on GTK. The image when read back from the
    369 // clipboard has the alpha channel set to 0xFF for some reason. The other
    370 // channels stay intact. So I am turning this on only for aura.
    371 //
    372 // TODO(erg): This also crashes in linux_aura. Investigate once bitmap writing
    373 // is implemented.
    374 #if (defined(USE_AURA) && !(defined(OS_WIN) || !defined(OS_CHROMEOS))) || \
    375     defined(OS_ANDROID)
    376 TEST_F(ClipboardTest, MultipleBitmapReadWriteTest) {
    377   // Test first bitmap
    378   unsigned int fake_bitmap_1[] = {
    379     0x46155189, 0xF6A55C8D, 0x79845674, 0xFA57BD89,
    380     0x78FD46AE, 0x87C64F5A, 0x36EDC5AF, 0x4378F568,
    381     0x91E9F63A, 0xC31EA14F, 0x69AB32DF, 0x643A3FD1,
    382   };
    383   gfx::Size fake_bitmap_1_size(3, 4);
    384   {
    385     ScopedClipboardWriter clipboard_writer(&clipboard(),
    386                                            Clipboard::BUFFER_STANDARD);
    387     clipboard_writer.WriteBitmapFromPixels(fake_bitmap_1, fake_bitmap_1_size);
    388   }
    389   EXPECT_TRUE(clipboard().IsFormatAvailable(Clipboard::GetBitmapFormatType(),
    390                                             Clipboard::BUFFER_STANDARD));
    391   SkBitmap image_1 = clipboard().ReadImage(Clipboard::BUFFER_STANDARD);
    392   EXPECT_EQ(fake_bitmap_1_size, gfx::Size(image_1.width(), image_1.height()));
    393   unsigned int* pixels_1 = reinterpret_cast<unsigned int*>(image_1.getPixels());
    394   for (int i = 0; i < fake_bitmap_1_size.width(); ++i) {
    395     for (int j = 0; j < fake_bitmap_1_size.height(); ++j) {
    396       int id = i * fake_bitmap_1_size.height() + j;
    397       EXPECT_EQ(fake_bitmap_1[id], pixels_1[id]);
    398     }
    399   }
    400 
    401   // Test second bitmap
    402   unsigned int fake_bitmap_2[] = {
    403     0x46155189, 0xF6A55C8D,
    404     0x79845674, 0xFA57BD89,
    405     0x78FD46AE, 0x87C64F5A,
    406     0x36EDC5AF, 0x4378F568,
    407     0x91E9F63A, 0xC31EA14F,
    408     0x69AB32DF, 0x643A3FD1,
    409     0xA6DF041D, 0x83046278,
    410   };
    411   gfx::Size fake_bitmap_2_size(7, 2);
    412   {
    413     ScopedClipboardWriter clipboard_writer(&clipboard(),
    414                                            Clipboard::BUFFER_STANDARD);
    415     clipboard_writer.WriteBitmapFromPixels(fake_bitmap_2, fake_bitmap_2_size);
    416   }
    417   EXPECT_TRUE(clipboard().IsFormatAvailable(Clipboard::GetBitmapFormatType(),
    418                                             Clipboard::BUFFER_STANDARD));
    419   SkBitmap image_2 = clipboard().ReadImage(Clipboard::BUFFER_STANDARD);
    420   EXPECT_EQ(fake_bitmap_2_size, gfx::Size(image_2.width(), image_2.height()));
    421   unsigned int* pixels_2 = reinterpret_cast<unsigned int*>(image_2.getPixels());
    422   for (int i = 0; i < fake_bitmap_2_size.width(); ++i) {
    423     for (int j = 0; j < fake_bitmap_2_size.height(); ++j) {
    424       int id = i * fake_bitmap_2_size.height() + j;
    425       EXPECT_EQ(fake_bitmap_2[id], pixels_2[id]);
    426     }
    427   }
    428 }
    429 #endif
    430 
    431 TEST_F(ClipboardTest, DataTest) {
    432   const ui::Clipboard::FormatType kFormat =
    433       ui::Clipboard::GetFormatType("chromium/x-test-format");
    434   std::string payload("test string");
    435   Pickle write_pickle;
    436   write_pickle.WriteString(payload);
    437 
    438   {
    439     ScopedClipboardWriter clipboard_writer(&clipboard(),
    440                                            Clipboard::BUFFER_STANDARD);
    441     clipboard_writer.WritePickledData(write_pickle, kFormat);
    442   }
    443 
    444   ASSERT_TRUE(clipboard().IsFormatAvailable(
    445       kFormat, Clipboard::BUFFER_STANDARD));
    446   std::string output;
    447   clipboard().ReadData(kFormat, &output);
    448   ASSERT_FALSE(output.empty());
    449 
    450   Pickle read_pickle(output.data(), output.size());
    451   PickleIterator iter(read_pickle);
    452   std::string unpickled_string;
    453   ASSERT_TRUE(read_pickle.ReadString(&iter, &unpickled_string));
    454   EXPECT_EQ(payload, unpickled_string);
    455 }
    456 
    457 TEST_F(ClipboardTest, MultipleDataTest) {
    458   const ui::Clipboard::FormatType kFormat1 =
    459       ui::Clipboard::GetFormatType("chromium/x-test-format1");
    460   std::string payload1("test string1");
    461   Pickle write_pickle1;
    462   write_pickle1.WriteString(payload1);
    463 
    464   const ui::Clipboard::FormatType kFormat2 =
    465       ui::Clipboard::GetFormatType("chromium/x-test-format2");
    466   std::string payload2("test string2");
    467   Pickle write_pickle2;
    468   write_pickle2.WriteString(payload2);
    469 
    470   {
    471     ScopedClipboardWriter clipboard_writer(&clipboard(),
    472                                            Clipboard::BUFFER_STANDARD);
    473     clipboard_writer.WritePickledData(write_pickle1, kFormat1);
    474     // overwrite the previous pickle for fun
    475     clipboard_writer.WritePickledData(write_pickle2, kFormat2);
    476   }
    477 
    478   ASSERT_TRUE(clipboard().IsFormatAvailable(
    479       kFormat2, Clipboard::BUFFER_STANDARD));
    480 
    481   // Check string 2.
    482   std::string output2;
    483   clipboard().ReadData(kFormat2, &output2);
    484   ASSERT_FALSE(output2.empty());
    485 
    486   Pickle read_pickle2(output2.data(), output2.size());
    487   PickleIterator iter2(read_pickle2);
    488   std::string unpickled_string2;
    489   ASSERT_TRUE(read_pickle2.ReadString(&iter2, &unpickled_string2));
    490   EXPECT_EQ(payload2, unpickled_string2);
    491 
    492   {
    493     ScopedClipboardWriter clipboard_writer(&clipboard(),
    494                                            Clipboard::BUFFER_STANDARD);
    495     clipboard_writer.WritePickledData(write_pickle2, kFormat2);
    496     // overwrite the previous pickle for fun
    497     clipboard_writer.WritePickledData(write_pickle1, kFormat1);
    498   }
    499 
    500   ASSERT_TRUE(clipboard().IsFormatAvailable(
    501       kFormat1, Clipboard::BUFFER_STANDARD));
    502 
    503   // Check string 1.
    504   std::string output1;
    505   clipboard().ReadData(kFormat1, &output1);
    506   ASSERT_FALSE(output1.empty());
    507 
    508   Pickle read_pickle1(output1.data(), output1.size());
    509   PickleIterator iter1(read_pickle1);
    510   std::string unpickled_string1;
    511   ASSERT_TRUE(read_pickle1.ReadString(&iter1, &unpickled_string1));
    512   EXPECT_EQ(payload1, unpickled_string1);
    513 }
    514 
    515 #if defined(OS_WIN)  // Windows only tests.
    516 TEST_F(ClipboardTest, HyperlinkTest) {
    517   const std::string kTitle("The Example Company");
    518   const std::string kUrl("http://www.example.com/");
    519   const std::string kExpectedHtml("<a href=\"http://www.example.com/\">"
    520                                   "The Example Company</a>");
    521   std::string url_result;
    522   string16 html_result;
    523 
    524   {
    525     ScopedClipboardWriter clipboard_writer(&clipboard(),
    526                                            Clipboard::BUFFER_STANDARD);
    527     clipboard_writer.WriteHyperlink(ASCIIToUTF16(kTitle), kUrl);
    528   }
    529 
    530   EXPECT_TRUE(clipboard().IsFormatAvailable(Clipboard::GetHtmlFormatType(),
    531                                             Clipboard::BUFFER_STANDARD));
    532   uint32 ignored;
    533   clipboard().ReadHTML(Clipboard::BUFFER_STANDARD, &html_result, &url_result,
    534                        &ignored, &ignored);
    535   EXPECT_PRED2(MarkupMatches, ASCIIToUTF16(kExpectedHtml), html_result);
    536 }
    537 
    538 TEST_F(ClipboardTest, WebSmartPasteTest) {
    539   {
    540     ScopedClipboardWriter clipboard_writer(&clipboard(),
    541                                            Clipboard::BUFFER_STANDARD);
    542     clipboard_writer.WriteWebSmartPaste();
    543   }
    544 
    545   EXPECT_TRUE(clipboard().IsFormatAvailable(
    546       Clipboard::GetWebKitSmartPasteFormatType(), Clipboard::BUFFER_STANDARD));
    547 }
    548 
    549 TEST_F(ClipboardTest, BitmapTest) {
    550   unsigned int fake_bitmap[] = {
    551     0x46155189, 0xF6A55C8D, 0x79845674, 0xFA57BD89,
    552     0x78FD46AE, 0x87C64F5A, 0x36EDC5AF, 0x4378F568,
    553     0x91E9F63A, 0xC31EA14F, 0x69AB32DF, 0x643A3FD1,
    554   };
    555 
    556   {
    557     ScopedClipboardWriter clipboard_writer(&clipboard(),
    558                                            Clipboard::BUFFER_STANDARD);
    559     clipboard_writer.WriteBitmapFromPixels(fake_bitmap, gfx::Size(3, 4));
    560   }
    561 
    562   EXPECT_TRUE(clipboard().IsFormatAvailable(Clipboard::GetBitmapFormatType(),
    563                                             Clipboard::BUFFER_STANDARD));
    564 }
    565 
    566 void HtmlTestHelper(const std::string& cf_html,
    567                     const std::string& expected_html) {
    568   std::string html;
    569   ClipboardUtil::CFHtmlToHtml(cf_html, &html, NULL);
    570   EXPECT_EQ(html, expected_html);
    571 }
    572 
    573 TEST_F(ClipboardTest, HtmlTest) {
    574   // Test converting from CF_HTML format data with <!--StartFragment--> and
    575   // <!--EndFragment--> comments, like from MS Word.
    576   HtmlTestHelper("Version:1.0\r\n"
    577                  "StartHTML:0000000105\r\n"
    578                  "EndHTML:0000000199\r\n"
    579                  "StartFragment:0000000123\r\n"
    580                  "EndFragment:0000000161\r\n"
    581                  "\r\n"
    582                  "<html>\r\n"
    583                  "<body>\r\n"
    584                  "<!--StartFragment-->\r\n"
    585                  "\r\n"
    586                  "<p>Foo</p>\r\n"
    587                  "\r\n"
    588                  "<!--EndFragment-->\r\n"
    589                  "</body>\r\n"
    590                  "</html>\r\n\r\n",
    591                  "<p>Foo</p>");
    592 
    593   // Test converting from CF_HTML format data without <!--StartFragment--> and
    594   // <!--EndFragment--> comments, like from OpenOffice Writer.
    595   HtmlTestHelper("Version:1.0\r\n"
    596                  "StartHTML:0000000105\r\n"
    597                  "EndHTML:0000000151\r\n"
    598                  "StartFragment:0000000121\r\n"
    599                  "EndFragment:0000000131\r\n"
    600                  "<html>\r\n"
    601                  "<body>\r\n"
    602                  "<p>Foo</p>\r\n"
    603                  "</body>\r\n"
    604                  "</html>\r\n\r\n",
    605                  "<p>Foo</p>");
    606 }
    607 #endif  // defined(OS_WIN)
    608 
    609 // Test writing all formats we have simultaneously.
    610 TEST_F(ClipboardTest, WriteEverything) {
    611   {
    612     ScopedClipboardWriter writer(&clipboard(), Clipboard::BUFFER_STANDARD);
    613     writer.WriteText(UTF8ToUTF16("foo"));
    614     writer.WriteURL(UTF8ToUTF16("foo"));
    615     writer.WriteHTML(UTF8ToUTF16("foo"), "bar");
    616     writer.WriteBookmark(UTF8ToUTF16("foo"), "bar");
    617     writer.WriteHyperlink(ASCIIToUTF16("foo"), "bar");
    618     writer.WriteWebSmartPaste();
    619     // Left out: WriteFile, WriteFiles, WriteBitmapFromPixels, WritePickledData.
    620   }
    621 
    622   // Passes if we don't crash.
    623 }
    624 
    625 #if defined(OS_ANDROID)
    626 
    627 // Test that if another application writes some text to the pasteboard the
    628 // clipboard properly invalidates other types.
    629 TEST_F(ClipboardTest, InternalClipboardInvalidation) {
    630   const unsigned int kFakeBitmap[] = {
    631     0x46155189, 0xF6A55C8D, 0x79845674, 0xFA57BD89,
    632     0x78FD46AE, 0x87C64F5A, 0x36EDC5AF, 0x4378F568,
    633     0x91E9F63A, 0xC31EA14F, 0x69AB32DF, 0x643A3FD1,
    634   };
    635 
    636   // Write a bitmap in our clipboard().
    637   {
    638     ScopedClipboardWriter clipboard_writer(&clipboard(),
    639                                            Clipboard::BUFFER_STANDARD);
    640     clipboard_writer.WriteBitmapFromPixels(kFakeBitmap, gfx::Size(3, 4));
    641   }
    642 
    643   //
    644   // Simulate that another application copied something in the Clipboard
    645   //
    646   std::string new_value("Some text copied by some other app");
    647   using base::android::ConvertUTF8ToJavaString;
    648   using base::android::MethodID;
    649   using base::android::ScopedJavaLocalRef;
    650 
    651   JNIEnv* env = base::android::AttachCurrentThread();
    652   ASSERT_TRUE(env);
    653 
    654   jobject context = base::android::GetApplicationContext();
    655   ASSERT_TRUE(context);
    656 
    657   ScopedJavaLocalRef<jclass> context_class =
    658       base::android::GetClass(env, "android/content/Context");
    659 
    660   jmethodID get_system_service = MethodID::Get<MethodID::TYPE_INSTANCE>(
    661       env, context_class.obj(), "getSystemService",
    662       "(Ljava/lang/String;)Ljava/lang/Object;");
    663 
    664   // Retrieve the system service.
    665   ScopedJavaLocalRef<jstring> service_name = ConvertUTF8ToJavaString(
    666       env, "clipboard");
    667   ScopedJavaLocalRef<jobject> clipboard_manager(
    668       env, env->CallObjectMethod(
    669         context, get_system_service, service_name.obj()));
    670   ASSERT_TRUE(clipboard_manager.obj() && !base::android::ClearException(env));
    671 
    672   ScopedJavaLocalRef<jclass> clipboard_class =
    673       base::android::GetClass(env, "android/text/ClipboardManager");
    674   jmethodID set_text = MethodID::Get<MethodID::TYPE_INSTANCE>(
    675       env, clipboard_class.obj(), "setText", "(Ljava/lang/CharSequence;)V");
    676   ScopedJavaLocalRef<jstring> new_value_string = ConvertUTF8ToJavaString(
    677       env, new_value.c_str());
    678 
    679   // Will need to call toString as CharSequence is not always a String.
    680   env->CallVoidMethod(clipboard_manager.obj(),
    681                       set_text,
    682                       new_value_string.obj());
    683 
    684   // The bitmap that should have been available should be gone.
    685   EXPECT_FALSE(clipboard().IsFormatAvailable(Clipboard::GetBitmapFormatType(),
    686                                              Clipboard::BUFFER_STANDARD));
    687 
    688   // Make sure some text is available
    689   EXPECT_TRUE(clipboard().IsFormatAvailable(
    690       Clipboard::GetPlainTextWFormatType(), Clipboard::BUFFER_STANDARD));
    691 
    692   // Make sure the text is what we inserted while simulating the other app
    693   std::string contents;
    694   clipboard().ReadAsciiText(Clipboard::BUFFER_STANDARD, &contents);
    695   EXPECT_EQ(contents, new_value);
    696 }
    697 #endif
    698 }  // namespace ui
    699