test_flash_clipboard.cc revision 5821806d5e7f356e8fa4b058a389a808ea183019
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/tests/test_flash_clipboard.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <algorithm> 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/cpp/instance.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/cpp/module.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/cpp/point.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/cpp/private/flash_clipboard.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/cpp/var.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/cpp/var_array_buffer.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/tests/testing_instance.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)REGISTER_TEST_CASE(FlashClipboard); 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WriteData() sends an async request to the browser process. As a result, the 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// string written may not be reflected by IsFormatAvailable() or ReadPlainText() 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// immediately. We need to wait and retry. 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kIntervalMs = 250; 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kMaxIntervals = kActionTimeoutMs / kIntervalMs; 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TestFlashClipboard::TestFlashClipboard(TestingInstance* instance) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : TestCase(instance) { 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestFlashClipboard::RunTests(const std::string& filter) { 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RUN_TEST(ReadWritePlainText, filter); 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RUN_TEST(ReadWriteHTML, filter); 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RUN_TEST(ReadWriteRTF, filter); 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RUN_TEST(ReadWriteCustomData, filter); 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RUN_TEST(ReadWriteMultipleFormats, filter); 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RUN_TEST(Clear, filter); 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RUN_TEST(InvalidFormat, filter); 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RUN_TEST(RegisterCustomFormat, filter); 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool TestFlashClipboard::ReadStringVar(uint32_t format, std::string* result) { 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp::Var text; 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool success = pp::flash::Clipboard::ReadData( 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) instance_, 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_FLASH_CLIPBOARD_TYPE_STANDARD, 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) format, 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &text); 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (success && text.is_string()) { 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *result = text.AsString(); 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool TestFlashClipboard::WriteStringVar(uint32_t format, 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& text) { 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<uint32_t> formats_vector(1, format); 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<pp::Var> data_vector(1, pp::Var(text)); 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool success = pp::flash::Clipboard::WriteData( 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) instance_, 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_FLASH_CLIPBOARD_TYPE_STANDARD, 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) formats_vector, 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data_vector); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return success; 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool TestFlashClipboard::IsFormatAvailableMatches(uint32_t format, 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool expected) { 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < kMaxIntervals; ++i) { 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_available = pp::flash::Clipboard::IsFormatAvailable( 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) instance_, 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_FLASH_CLIPBOARD_TYPE_STANDARD, 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) format); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_available == expected) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PlatformSleep(kIntervalMs); 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool TestFlashClipboard::ReadPlainTextMatches(const std::string& expected) { 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < kMaxIntervals; ++i) { 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string result; 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool success = ReadStringVar(PP_FLASH_CLIPBOARD_FORMAT_PLAINTEXT, &result); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (success && result == expected) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PlatformSleep(kIntervalMs); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool TestFlashClipboard::ReadHTMLMatches(const std::string& expected) { 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < kMaxIntervals; ++i) { 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string result; 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool success = ReadStringVar(PP_FLASH_CLIPBOARD_FORMAT_HTML, &result); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Harmless markup may be inserted around the copied html on some 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // platforms, so just check that the pasted string contains the 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // copied string. Also check that we only paste the copied fragment, see 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // http://code.google.com/p/chromium/issues/detail?id=130827. 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (success && result.find(expected) != std::string::npos && 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result.find("<!--StartFragment-->") == std::string::npos && 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result.find("<!--EndFragment-->") == std::string::npos) { 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PlatformSleep(kIntervalMs); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string TestFlashClipboard::TestReadWritePlainText() { 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string input = "Hello world plain text!"; 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(WriteStringVar(PP_FLASH_CLIPBOARD_FORMAT_PLAINTEXT, input)); 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(IsFormatAvailableMatches(PP_FLASH_CLIPBOARD_FORMAT_PLAINTEXT, 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) true)); 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(ReadPlainTextMatches(input)); 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PASS(); 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string TestFlashClipboard::TestReadWriteHTML() { 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string input = "Hello world html!"; 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(WriteStringVar(PP_FLASH_CLIPBOARD_FORMAT_HTML, input)); 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(IsFormatAvailableMatches(PP_FLASH_CLIPBOARD_FORMAT_HTML, true)); 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(ReadHTMLMatches(input)); 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PASS(); 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string TestFlashClipboard::TestReadWriteRTF() { 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string rtf_string = 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "{\\rtf1\\ansi{\\fonttbl\\f0\\fswiss Helvetica;}\\f0\\pard\n" 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "This is some {\\b bold} text.\\par\n" 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "}"; 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp::VarArrayBuffer array_buffer(rtf_string.size()); 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char* bytes = static_cast<char*>(array_buffer.Map()); 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::copy(rtf_string.data(), rtf_string.data() + rtf_string.size(), bytes); 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<uint32_t> formats_vector(1, PP_FLASH_CLIPBOARD_FORMAT_RTF); 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<pp::Var> data_vector(1, array_buffer); 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(pp::flash::Clipboard::WriteData( 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) instance_, 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_FLASH_CLIPBOARD_TYPE_STANDARD, 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) formats_vector, 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data_vector)); 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(IsFormatAvailableMatches(PP_FLASH_CLIPBOARD_FORMAT_RTF, true)); 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp::Var rtf_result; 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(pp::flash::Clipboard::ReadData( 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) instance_, 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_FLASH_CLIPBOARD_TYPE_STANDARD, 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_FLASH_CLIPBOARD_FORMAT_RTF, 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &rtf_result)); 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(rtf_result.is_array_buffer()); 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp::VarArrayBuffer array_buffer_result(rtf_result); 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(array_buffer_result.ByteLength() == array_buffer.ByteLength()); 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char* bytes_result = static_cast<char*>(array_buffer_result.Map()); 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(std::equal(bytes, bytes + array_buffer.ByteLength(), 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bytes_result)); 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PASS(); 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string TestFlashClipboard::TestReadWriteCustomData() { 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string custom_data = "custom_data"; 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp::VarArrayBuffer array_buffer(custom_data.size()); 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char* bytes = static_cast<char*>(array_buffer.Map()); 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::copy(custom_data.begin(), custom_data.end(), bytes); 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32_t format_id = 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp::flash::Clipboard::RegisterCustomFormat(instance_, "my-format"); 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NE(format_id, PP_FLASH_CLIPBOARD_FORMAT_INVALID); 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<uint32_t> formats_vector(1, format_id); 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<pp::Var> data_vector(1, array_buffer); 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(pp::flash::Clipboard::WriteData( 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) instance_, 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_FLASH_CLIPBOARD_TYPE_STANDARD, 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) formats_vector, 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data_vector)); 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(IsFormatAvailableMatches(format_id, true)); 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp::Var custom_data_result; 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(pp::flash::Clipboard::ReadData( 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) instance_, 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_FLASH_CLIPBOARD_TYPE_STANDARD, 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) format_id, 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &custom_data_result)); 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(custom_data_result.is_array_buffer()); 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp::VarArrayBuffer array_buffer_result(custom_data_result); 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(array_buffer_result.ByteLength(), array_buffer.ByteLength()); 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char* bytes_result = static_cast<char*>(array_buffer_result.Map()); 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(std::equal(bytes, bytes + array_buffer.ByteLength(), 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bytes_result)); 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PASS(); 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string TestFlashClipboard::TestReadWriteMultipleFormats() { 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<uint32_t> formats; 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<pp::Var> data; 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) formats.push_back(PP_FLASH_CLIPBOARD_FORMAT_PLAINTEXT); 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data.push_back(pp::Var("plain text")); 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) formats.push_back(PP_FLASH_CLIPBOARD_FORMAT_HTML); 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data.push_back(pp::Var("html")); 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool success = pp::flash::Clipboard::WriteData( 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) instance_, 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_FLASH_CLIPBOARD_TYPE_STANDARD, 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) formats, 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data); 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(success); 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(IsFormatAvailableMatches(PP_FLASH_CLIPBOARD_FORMAT_PLAINTEXT, 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) true)); 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(IsFormatAvailableMatches(PP_FLASH_CLIPBOARD_FORMAT_HTML, true)); 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(ReadPlainTextMatches(data[0].AsString())); 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(ReadHTMLMatches(data[1].AsString())); 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PASS(); 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string TestFlashClipboard::TestClear() { 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string input = "Hello world plain text!"; 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(WriteStringVar(PP_FLASH_CLIPBOARD_FORMAT_PLAINTEXT, input)); 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(IsFormatAvailableMatches(PP_FLASH_CLIPBOARD_FORMAT_PLAINTEXT, 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) true)); 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool success = pp::flash::Clipboard::WriteData( 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) instance_, 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_FLASH_CLIPBOARD_TYPE_STANDARD, 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<uint32_t>(), 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<pp::Var>()); 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(success); 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(IsFormatAvailableMatches(PP_FLASH_CLIPBOARD_FORMAT_PLAINTEXT, 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) false)); 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PASS(); 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string TestFlashClipboard::TestInvalidFormat() { 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32_t invalid_format = 999; 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(WriteStringVar(invalid_format, "text")); 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(IsFormatAvailableMatches(invalid_format, false)); 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string unused; 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(ReadStringVar(invalid_format, &unused)); 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PASS(); 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string TestFlashClipboard::TestRegisterCustomFormat() { 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test an empty name is rejected. 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32_t format_id = 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp::flash::Clipboard::RegisterCustomFormat(instance_, ""); 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(format_id, PP_FLASH_CLIPBOARD_FORMAT_INVALID); 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test a valid format name. 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) format_id = pp::flash::Clipboard::RegisterCustomFormat(instance_, "a-b"); 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NE(format_id, PP_FLASH_CLIPBOARD_FORMAT_INVALID); 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure the format doesn't collide with predefined formats. 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NE(format_id, PP_FLASH_CLIPBOARD_FORMAT_PLAINTEXT); 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NE(format_id, PP_FLASH_CLIPBOARD_FORMAT_HTML); 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NE(format_id, PP_FLASH_CLIPBOARD_FORMAT_RTF); 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check that if the same name is registered, the same id comes out. 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32_t format_id2 = 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp::flash::Clipboard::RegisterCustomFormat(instance_, "a-b"); 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(format_id, format_id2); 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check that the second format registered has a different id. 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32_t format_id3 = 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp::flash::Clipboard::RegisterCustomFormat(instance_, "a-b-c"); 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NE(format_id, format_id3); 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PASS(); 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 276