diff options
author | jeremy@chromium.org <jeremy@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-01-27 10:24:59 +0000 |
---|---|---|
committer | jeremy@chromium.org <jeremy@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-01-27 10:24:59 +0000 |
commit | e344c910c5f4a1c88e3da37e074873a6360f3624 (patch) | |
tree | 4c3717fd77e4fcd62fbcb5da37cfe10ca25146fe /app/clipboard/clipboard_unittest.cc | |
parent | 98e053c3baec827f9177a429e46abe36cd4fb9f2 (diff) | |
download | chromium_src-e344c910c5f4a1c88e3da37e074873a6360f3624.zip chromium_src-e344c910c5f4a1c88e3da37e074873a6360f3624.tar.gz chromium_src-e344c910c5f4a1c88e3da37e074873a6360f3624.tar.bz2 |
POSIX: Use Shared Mem transport to copy images.
Prior to this change images where copied inline in IPC messages on non-Windows platforms. Copying an oversized image would cause the IPC system to bork and crash the renderer.
Changes in this CL:
* All platforms use a unified mechanism to copy images using shared memory.
* Introduced a new IPC message so the renderer can allocated a shared memory segment on OS X.
* On OS X tried to keep as few copies of the image data in memory as possible.
BUG=26822
TEST=1)On all platforms: navigate to a webpage, right click on an image and copy. Then try pasting into an image editor. 2)Repro steps in bug should no longer crash the Renderer on Mac/Linux
Review URL: http://codereview.chromium.org/552129
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@37247 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'app/clipboard/clipboard_unittest.cc')
-rw-r--r-- | app/clipboard/clipboard_unittest.cc | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/app/clipboard/clipboard_unittest.cc b/app/clipboard/clipboard_unittest.cc index 81f400d..8203bac 100644 --- a/app/clipboard/clipboard_unittest.cc +++ b/app/clipboard/clipboard_unittest.cc @@ -213,6 +213,50 @@ TEST_F(ClipboardTest, URLTest) { #endif // defined(OS_LINUX) } +TEST_F(ClipboardTest, SharedBitmapTest) { + unsigned int fake_bitmap[] = { + 0x46155189, 0xF6A55C8D, 0x79845674, 0xFA57BD89, + 0x78FD46AE, 0x87C64F5A, 0x36EDC5AF, 0x4378F568, + 0x91E9F63A, 0xC31EA14F, 0x69AB32DF, 0x643A3FD1, + }; + gfx::Size fake_bitmap_size(3, 4); + size_t bytes = sizeof(fake_bitmap); + + // Create shared memory region. + base::SharedMemory shared_buf; + ASSERT_TRUE(shared_buf.Create(L"", false, true, bytes)); + ASSERT_TRUE(shared_buf.Map(bytes)); + memcpy(shared_buf.memory(), fake_bitmap, bytes); + base::SharedMemoryHandle handle_to_share; + base::ProcessHandle current_process = NULL; +#if defined(OS_WIN) + current_process = GetCurrentProcess(); +#endif + shared_buf.ShareToProcess(current_process, &handle_to_share); + ASSERT_TRUE(shared_buf.Unmap()); + + // Setup data for clipboard. + Clipboard::ObjectMapParam placeholder_param; + Clipboard::ObjectMapParam size_param; + const char* size_data = reinterpret_cast<const char*>(&fake_bitmap_size); + for (size_t i = 0; i < sizeof(fake_bitmap_size); ++i) + size_param.push_back(size_data[i]); + + Clipboard::ObjectMapParams params; + params.push_back(placeholder_param); + params.push_back(size_param); + + Clipboard::ObjectMap objects; + objects[Clipboard::CBF_SMBITMAP] = params; + Clipboard::ReplaceSharedMemHandle(&objects, handle_to_share, current_process); + + Clipboard clipboard; + clipboard.WriteObjects(objects); + + EXPECT_TRUE(clipboard.IsFormatAvailable(Clipboard::GetBitmapFormatType(), + Clipboard::BUFFER_STANDARD)); +} + #if defined(OS_WIN) || (defined(OS_POSIX) && !defined(OS_MACOSX)) TEST_F(ClipboardTest, DataTest) { Clipboard clipboard; |