OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "build/build_config.h" | 5 #include "build/build_config.h" |
6 | 6 |
7 #include <string> | 7 #include <string> |
8 | 8 |
9 #include "base/basictypes.h" | 9 #include "base/basictypes.h" |
10 #include "base/memory/scoped_ptr.h" | 10 #include "base/memory/scoped_ptr.h" |
(...skipping 313 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
324 clipboard().ReadAsciiText(CLIPBOARD_TYPE_COPY_PASTE, &ascii_text); | 324 clipboard().ReadAsciiText(CLIPBOARD_TYPE_COPY_PASTE, &ascii_text); |
325 EXPECT_EQ(UTF16ToUTF8(url), ascii_text); | 325 EXPECT_EQ(UTF16ToUTF8(url), ascii_text); |
326 | 326 |
327 #if defined(OS_POSIX) && !defined(OS_MACOSX) && !defined(OS_ANDROID) | 327 #if defined(OS_POSIX) && !defined(OS_MACOSX) && !defined(OS_ANDROID) |
328 ascii_text.clear(); | 328 ascii_text.clear(); |
329 clipboard().ReadAsciiText(CLIPBOARD_TYPE_SELECTION, &ascii_text); | 329 clipboard().ReadAsciiText(CLIPBOARD_TYPE_SELECTION, &ascii_text); |
330 EXPECT_EQ(UTF16ToUTF8(url), ascii_text); | 330 EXPECT_EQ(UTF16ToUTF8(url), ascii_text); |
331 #endif | 331 #endif |
332 } | 332 } |
333 | 333 |
334 // TODO(dcheng): The tests for copying to the clipboard also test IPC | |
335 // interaction... consider moving them to a different layer so we can | |
336 // consolidate the validation logic. | |
337 // Note that |bitmap_data| is not premultiplied! | |
338 static void TestBitmapWrite(Clipboard* clipboard, | 334 static void TestBitmapWrite(Clipboard* clipboard, |
339 const uint32* bitmap_data, | 335 const gfx::Size& size, |
340 size_t bitmap_data_size, | 336 const uint32* bitmap_data) { |
341 const gfx::Size& size) { | 337 { |
342 // Create shared memory region. | 338 ScopedClipboardWriter scw(CLIPBOARD_TYPE_COPY_PASTE); |
343 base::SharedMemory shared_buf; | 339 SkBitmap bitmap; |
344 ASSERT_TRUE(shared_buf.CreateAndMapAnonymous(bitmap_data_size)); | 340 ASSERT_TRUE(bitmap.setInfo( |
345 memcpy(shared_buf.memory(), bitmap_data, bitmap_data_size); | 341 SkImageInfo::MakeN32Premul(size.width(), size.height()))); |
346 // CBF_SMBITMAP expects premultiplied bitmap data so do that now. | 342 bitmap.setPixels( |
347 uint32* pixel_buffer = static_cast<uint32*>(shared_buf.memory()); | 343 const_cast<void*>(reinterpret_cast<const void*>(bitmap_data))); |
348 for (int j = 0; j < size.height(); ++j) { | 344 scw.WriteImage(bitmap); |
349 for (int i = 0; i < size.width(); ++i) { | |
350 uint32& pixel = pixel_buffer[i + j * size.width()]; | |
351 pixel = SkPreMultiplyColor(pixel); | |
352 } | |
353 } | 345 } |
354 base::SharedMemoryHandle handle_to_share; | |
355 base::ProcessHandle current_process = base::kNullProcessHandle; | |
356 #if defined(OS_WIN) | |
357 current_process = GetCurrentProcess(); | |
358 #endif | |
359 shared_buf.ShareToProcess(current_process, &handle_to_share); | |
360 ASSERT_TRUE(shared_buf.Unmap()); | |
361 | |
362 // Setup data for clipboard(). | |
363 Clipboard::ObjectMapParam placeholder_param; | |
364 Clipboard::ObjectMapParam size_param; | |
365 const char* size_data = reinterpret_cast<const char*>(&size); | |
366 for (size_t i = 0; i < sizeof(size); ++i) | |
367 size_param.push_back(size_data[i]); | |
368 | |
369 Clipboard::ObjectMapParams params; | |
370 params.push_back(placeholder_param); | |
371 params.push_back(size_param); | |
372 | |
373 Clipboard::ObjectMap objects; | |
374 objects[Clipboard::CBF_SMBITMAP] = params; | |
375 ASSERT_TRUE(Clipboard::ReplaceSharedMemHandle( | |
376 &objects, handle_to_share, current_process)); | |
377 | |
378 ClipboardTest::WriteObjectsToClipboard(clipboard, objects); | |
379 | 346 |
380 EXPECT_TRUE(clipboard->IsFormatAvailable(Clipboard::GetBitmapFormatType(), | 347 EXPECT_TRUE(clipboard->IsFormatAvailable(Clipboard::GetBitmapFormatType(), |
381 CLIPBOARD_TYPE_COPY_PASTE)); | 348 CLIPBOARD_TYPE_COPY_PASTE)); |
382 const SkBitmap& image = clipboard->ReadImage(CLIPBOARD_TYPE_COPY_PASTE); | 349 const SkBitmap& image = clipboard->ReadImage(CLIPBOARD_TYPE_COPY_PASTE); |
383 EXPECT_EQ(size, gfx::Size(image.width(), image.height())); | 350 EXPECT_EQ(size, gfx::Size(image.width(), image.height())); |
384 SkAutoLockPixels image_lock(image); | 351 SkAutoLockPixels image_lock(image); |
385 for (int j = 0; j < image.height(); ++j) { | 352 for (int j = 0; j < image.height(); ++j) { |
386 const uint32* row_address = image.getAddr32(0, j); | 353 const uint32* row_address = image.getAddr32(0, j); |
387 for (int i = 0; i < image.width(); ++i) { | 354 for (int i = 0; i < image.width(); ++i) { |
388 int offset = i + j * image.width(); | 355 int offset = i + j * image.width(); |
389 uint32 pixel = SkPreMultiplyColor(bitmap_data[offset]); | 356 EXPECT_EQ(bitmap_data[offset], row_address[i]) << "i = " << i |
390 EXPECT_EQ(pixel, row_address[i]) | 357 << ", j = " << j; |
391 << "i = " << i << ", j = " << j; | |
392 } | 358 } |
393 } | 359 } |
394 } | 360 } |
395 | 361 |
396 TEST_F(ClipboardTest, SharedBitmapTest) { | 362 TEST_F(ClipboardTest, SharedBitmapTest) { |
397 const uint32 fake_bitmap_1[] = { | 363 const uint32 fake_bitmap_1[] = { |
398 0x46155189, 0xF6A55C8D, 0x79845674, 0xFA57BD89, | 364 0x46061626, 0xf69f5988, 0x793f2937, 0xfa55b986, |
399 0x78FD46AE, 0x87C64F5A, 0x36EDC5AF, 0x4378F568, | 365 0x78772152, 0x87692a30, 0x36322a25, 0x4320401b, |
400 0x91E9F63A, 0xC31EA14F, 0x69AB32DF, 0x643A3FD1, | 366 0x91848c21, 0xc3177b3c, 0x6946155c, 0x64171952, |
401 }; | 367 }; |
402 { | 368 { |
403 SCOPED_TRACE("first bitmap"); | 369 SCOPED_TRACE("first bitmap"); |
404 TestBitmapWrite( | 370 TestBitmapWrite(&clipboard(), gfx::Size(4, 3), fake_bitmap_1); |
405 &clipboard(), fake_bitmap_1, sizeof(fake_bitmap_1), gfx::Size(4, 3)); | |
406 } | 371 } |
407 | 372 |
408 const uint32 fake_bitmap_2[] = { | 373 const uint32 fake_bitmap_2[] = { |
409 0x46155189, 0xF6A55C8D, | 374 0x46061626, 0xf69f5988, |
410 0x79845674, 0xFA57BD89, | 375 0x793f2937, 0xfa55b986, |
411 0x78FD46AE, 0x87C64F5A, | 376 0x78772152, 0x87692a30, |
412 0x36EDC5AF, 0x4378F568, | 377 0x36322a25, 0x4320401b, |
413 0x91E9F63A, 0xC31EA14F, | 378 0x91848c21, 0xc3177b3c, |
414 0x69AB32DF, 0x643A3FD1, | 379 0x6946155c, 0x64171952, |
415 0xA6DF041D, 0x83046278, | 380 0xa6910313, 0x8302323e, |
416 }; | 381 }; |
417 { | 382 { |
418 SCOPED_TRACE("second bitmap"); | 383 SCOPED_TRACE("second bitmap"); |
419 TestBitmapWrite( | 384 TestBitmapWrite(&clipboard(), gfx::Size(2, 7), fake_bitmap_2); |
420 &clipboard(), fake_bitmap_2, sizeof(fake_bitmap_2), gfx::Size(2, 7)); | |
421 } | 385 } |
422 } | 386 } |
423 | 387 |
424 namespace { | |
425 // A size class that just happens to have the same layout as gfx::Size! | |
426 struct UnsafeSize { | |
427 int width; | |
428 int height; | |
429 }; | |
430 COMPILE_ASSERT(sizeof(UnsafeSize) == sizeof(gfx::Size), | |
431 UnsafeSize_must_be_same_size_as_gfx_Size); | |
432 } // namespace | |
433 | |
434 TEST_F(ClipboardTest, SharedBitmapWithTwoNegativeSizes) { | |
435 Clipboard::ObjectMapParam placeholder_param; | |
436 void* crash_me = reinterpret_cast<void*>(57); | |
437 placeholder_param.resize(sizeof(crash_me)); | |
438 memcpy(&placeholder_param.front(), &crash_me, sizeof(crash_me)); | |
439 | |
440 Clipboard::ObjectMapParam size_param; | |
441 UnsafeSize size = {-100, -100}; | |
442 size_param.resize(sizeof(size)); | |
443 memcpy(&size_param.front(), &size, sizeof(size)); | |
444 | |
445 Clipboard::ObjectMapParams params; | |
446 params.push_back(placeholder_param); | |
447 params.push_back(size_param); | |
448 | |
449 Clipboard::ObjectMap objects; | |
450 objects[Clipboard::CBF_SMBITMAP] = params; | |
451 | |
452 WriteObjectsToClipboard(objects); | |
453 EXPECT_FALSE(clipboard().IsFormatAvailable(Clipboard::GetBitmapFormatType(), | |
454 CLIPBOARD_TYPE_COPY_PASTE)); | |
455 } | |
456 | |
457 TEST_F(ClipboardTest, SharedBitmapWithOneNegativeSize) { | |
458 Clipboard::ObjectMapParam placeholder_param; | |
459 void* crash_me = reinterpret_cast<void*>(57); | |
460 placeholder_param.resize(sizeof(crash_me)); | |
461 memcpy(&placeholder_param.front(), &crash_me, sizeof(crash_me)); | |
462 | |
463 Clipboard::ObjectMapParam size_param; | |
464 UnsafeSize size = {-100, 100}; | |
465 size_param.resize(sizeof(size)); | |
466 memcpy(&size_param.front(), &size, sizeof(size)); | |
467 | |
468 Clipboard::ObjectMapParams params; | |
469 params.push_back(placeholder_param); | |
470 params.push_back(size_param); | |
471 | |
472 Clipboard::ObjectMap objects; | |
473 objects[Clipboard::CBF_SMBITMAP] = params; | |
474 | |
475 WriteObjectsToClipboard(objects); | |
476 EXPECT_FALSE(clipboard().IsFormatAvailable(Clipboard::GetBitmapFormatType(), | |
477 CLIPBOARD_TYPE_COPY_PASTE)); | |
478 } | |
479 | |
480 TEST_F(ClipboardTest, BitmapWithSuperSize) { | |
481 Clipboard::ObjectMapParam placeholder_param; | |
482 void* crash_me = reinterpret_cast<void*>(57); | |
483 placeholder_param.resize(sizeof(crash_me)); | |
484 memcpy(&placeholder_param.front(), &crash_me, sizeof(crash_me)); | |
485 | |
486 Clipboard::ObjectMapParam size_param; | |
487 // Width just big enough that bytes per row won't fit in a 32-bit | |
488 // representation. | |
489 gfx::Size size(0x20000000, 1); | |
490 size_param.resize(sizeof(size)); | |
491 memcpy(&size_param.front(), &size, sizeof(size)); | |
492 | |
493 Clipboard::ObjectMapParams params; | |
494 params.push_back(placeholder_param); | |
495 params.push_back(size_param); | |
496 | |
497 Clipboard::ObjectMap objects; | |
498 objects[Clipboard::CBF_SMBITMAP] = params; | |
499 | |
500 WriteObjectsToClipboard(objects); | |
501 EXPECT_FALSE(clipboard().IsFormatAvailable(Clipboard::GetBitmapFormatType(), | |
502 CLIPBOARD_TYPE_COPY_PASTE)); | |
503 } | |
504 | |
505 TEST_F(ClipboardTest, BitmapWithSuperSize2) { | |
506 Clipboard::ObjectMapParam placeholder_param; | |
507 void* crash_me = reinterpret_cast<void*>(57); | |
508 placeholder_param.resize(sizeof(crash_me)); | |
509 memcpy(&placeholder_param.front(), &crash_me, sizeof(crash_me)); | |
510 | |
511 Clipboard::ObjectMapParam size_param; | |
512 // Width and height large enough that SkBitmap::getSize() will be truncated. | |
513 gfx::Size size(0x0fffffff, 0x0fffffff); | |
514 size_param.resize(sizeof(size)); | |
515 memcpy(&size_param.front(), &size, sizeof(size)); | |
516 | |
517 Clipboard::ObjectMapParams params; | |
518 params.push_back(placeholder_param); | |
519 params.push_back(size_param); | |
520 | |
521 Clipboard::ObjectMap objects; | |
522 objects[Clipboard::CBF_SMBITMAP] = params; | |
523 | |
524 WriteObjectsToClipboard(objects); | |
525 EXPECT_FALSE(clipboard().IsFormatAvailable(Clipboard::GetBitmapFormatType(), | |
526 CLIPBOARD_TYPE_COPY_PASTE)); | |
527 } | |
528 | |
529 TEST_F(ClipboardTest, DataTest) { | 388 TEST_F(ClipboardTest, DataTest) { |
530 const ui::Clipboard::FormatType kFormat = | 389 const ui::Clipboard::FormatType kFormat = |
531 ui::Clipboard::GetFormatType("chromium/x-test-format"); | 390 ui::Clipboard::GetFormatType("chromium/x-test-format"); |
532 std::string payload("test string"); | 391 std::string payload("test string"); |
533 Pickle write_pickle; | 392 Pickle write_pickle; |
534 write_pickle.WriteString(payload); | 393 write_pickle.WriteString(payload); |
535 | 394 |
536 { | 395 { |
537 ScopedClipboardWriter clipboard_writer(CLIPBOARD_TYPE_COPY_PASTE); | 396 ScopedClipboardWriter clipboard_writer(CLIPBOARD_TYPE_COPY_PASTE); |
538 clipboard_writer.WritePickledData(write_pickle, kFormat); | 397 clipboard_writer.WritePickledData(write_pickle, kFormat); |
(...skipping 252 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
791 EXPECT_TRUE(clipboard().IsFormatAvailable( | 650 EXPECT_TRUE(clipboard().IsFormatAvailable( |
792 Clipboard::GetPlainTextWFormatType(), CLIPBOARD_TYPE_COPY_PASTE)); | 651 Clipboard::GetPlainTextWFormatType(), CLIPBOARD_TYPE_COPY_PASTE)); |
793 | 652 |
794 // Make sure the text is what we inserted while simulating the other app | 653 // Make sure the text is what we inserted while simulating the other app |
795 std::string contents; | 654 std::string contents; |
796 clipboard().ReadAsciiText(CLIPBOARD_TYPE_COPY_PASTE, &contents); | 655 clipboard().ReadAsciiText(CLIPBOARD_TYPE_COPY_PASTE, &contents); |
797 EXPECT_EQ(contents, new_value); | 656 EXPECT_EQ(contents, new_value); |
798 } | 657 } |
799 #endif | 658 #endif |
800 } // namespace ui | 659 } // namespace ui |
OLD | NEW |