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