| OLD | NEW |
| 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2008 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 // Many of these functions are based on those found in | 5 // Many of these functions are based on those found in |
| 6 // webkit/port/platform/PasteboardWin.cpp | 6 // webkit/port/platform/PasteboardWin.cpp |
| 7 | 7 |
| 8 #include <shlobj.h> | 8 #include <shlobj.h> |
| 9 #include <shellapi.h> | 9 #include <shellapi.h> |
| 10 | 10 |
| (...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 124 | 124 |
| 125 Clipboard::Clipboard() { | 125 Clipboard::Clipboard() { |
| 126 // make a dummy HWND to be the clipboard's owner | 126 // make a dummy HWND to be the clipboard's owner |
| 127 WNDCLASSEX wcex = {0}; | 127 WNDCLASSEX wcex = {0}; |
| 128 wcex.cbSize = sizeof(WNDCLASSEX); | 128 wcex.cbSize = sizeof(WNDCLASSEX); |
| 129 wcex.lpfnWndProc = ClipboardOwnerWndProc; | 129 wcex.lpfnWndProc = ClipboardOwnerWndProc; |
| 130 wcex.hInstance = GetModuleHandle(NULL); | 130 wcex.hInstance = GetModuleHandle(NULL); |
| 131 wcex.lpszClassName = L"ClipboardOwnerWindowClass"; | 131 wcex.lpszClassName = L"ClipboardOwnerWindowClass"; |
| 132 ::RegisterClassEx(&wcex); | 132 ::RegisterClassEx(&wcex); |
| 133 | 133 |
| 134 clipboard_owner_ = ::CreateWindow(L"ClipboardOwnerWindowClass", | 134 clipboard_owner_ = NULL; |
| 135 L"ClipboardOwnerWindow", | |
| 136 0, 0, 0, 0, 0, | |
| 137 HWND_MESSAGE, | |
| 138 0, 0, 0); | |
| 139 } | 135 } |
| 140 | 136 |
| 141 Clipboard::~Clipboard() { | 137 Clipboard::~Clipboard() { |
| 142 ::DestroyWindow(clipboard_owner_); | 138 if (clipboard_owner_) |
| 139 ::DestroyWindow(clipboard_owner_); |
| 143 clipboard_owner_ = NULL; | 140 clipboard_owner_ = NULL; |
| 144 } | 141 } |
| 145 | 142 |
| 146 void Clipboard::WriteObjects(const ObjectMap& objects) { | 143 void Clipboard::WriteObjects(const ObjectMap& objects) { |
| 147 WriteObjects(objects, NULL); | 144 WriteObjects(objects, NULL); |
| 148 } | 145 } |
| 149 | 146 |
| 150 void Clipboard::WriteObjects(const ObjectMap& objects, | 147 void Clipboard::WriteObjects(const ObjectMap& objects, |
| 151 base::ProcessHandle process) { | 148 base::ProcessHandle process) { |
| 152 ScopedClipboard clipboard; | 149 ScopedClipboard clipboard; |
| 153 if (!clipboard.Acquire(clipboard_owner_)) | 150 if (!clipboard.Acquire(GetClipboardWindow())) |
| 154 return; | 151 return; |
| 155 | 152 |
| 156 ::EmptyClipboard(); | 153 ::EmptyClipboard(); |
| 157 | 154 |
| 158 for (ObjectMap::const_iterator iter = objects.begin(); | 155 for (ObjectMap::const_iterator iter = objects.begin(); |
| 159 iter != objects.end(); ++iter) { | 156 iter != objects.end(); ++iter) { |
| 160 if (iter->first == CBF_SMBITMAP) | 157 if (iter->first == CBF_SMBITMAP) |
| 161 WriteBitmapFromSharedMemory(&(iter->second[0].front()), | 158 WriteBitmapFromSharedMemory(&(iter->second[0].front()), |
| 162 &(iter->second[1].front()), | 159 &(iter->second[1].front()), |
| 163 process); | 160 process); |
| (...skipping 214 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 378 void Clipboard::ReadText(std::wstring* result) const { | 375 void Clipboard::ReadText(std::wstring* result) const { |
| 379 if (!result) { | 376 if (!result) { |
| 380 NOTREACHED(); | 377 NOTREACHED(); |
| 381 return; | 378 return; |
| 382 } | 379 } |
| 383 | 380 |
| 384 result->clear(); | 381 result->clear(); |
| 385 | 382 |
| 386 // Acquire the clipboard. | 383 // Acquire the clipboard. |
| 387 ScopedClipboard clipboard; | 384 ScopedClipboard clipboard; |
| 388 if (!clipboard.Acquire(clipboard_owner_)) | 385 if (!clipboard.Acquire(GetClipboardWindow())) |
| 389 return; | 386 return; |
| 390 | 387 |
| 391 HANDLE data = ::GetClipboardData(CF_UNICODETEXT); | 388 HANDLE data = ::GetClipboardData(CF_UNICODETEXT); |
| 392 if (!data) | 389 if (!data) |
| 393 return; | 390 return; |
| 394 | 391 |
| 395 result->assign(static_cast<const wchar_t*>(::GlobalLock(data))); | 392 result->assign(static_cast<const wchar_t*>(::GlobalLock(data))); |
| 396 ::GlobalUnlock(data); | 393 ::GlobalUnlock(data); |
| 397 } | 394 } |
| 398 | 395 |
| 399 void Clipboard::ReadAsciiText(std::string* result) const { | 396 void Clipboard::ReadAsciiText(std::string* result) const { |
| 400 if (!result) { | 397 if (!result) { |
| 401 NOTREACHED(); | 398 NOTREACHED(); |
| 402 return; | 399 return; |
| 403 } | 400 } |
| 404 | 401 |
| 405 result->clear(); | 402 result->clear(); |
| 406 | 403 |
| 407 // Acquire the clipboard. | 404 // Acquire the clipboard. |
| 408 ScopedClipboard clipboard; | 405 ScopedClipboard clipboard; |
| 409 if (!clipboard.Acquire(clipboard_owner_)) | 406 if (!clipboard.Acquire(GetClipboardWindow())) |
| 410 return; | 407 return; |
| 411 | 408 |
| 412 HANDLE data = ::GetClipboardData(CF_TEXT); | 409 HANDLE data = ::GetClipboardData(CF_TEXT); |
| 413 if (!data) | 410 if (!data) |
| 414 return; | 411 return; |
| 415 | 412 |
| 416 result->assign(static_cast<const char*>(::GlobalLock(data))); | 413 result->assign(static_cast<const char*>(::GlobalLock(data))); |
| 417 ::GlobalUnlock(data); | 414 ::GlobalUnlock(data); |
| 418 } | 415 } |
| 419 | 416 |
| 420 void Clipboard::ReadHTML(std::wstring* markup, std::string* src_url) const { | 417 void Clipboard::ReadHTML(std::wstring* markup, std::string* src_url) const { |
| 421 if (markup) | 418 if (markup) |
| 422 markup->clear(); | 419 markup->clear(); |
| 423 | 420 |
| 424 if (src_url) | 421 if (src_url) |
| 425 src_url->clear(); | 422 src_url->clear(); |
| 426 | 423 |
| 427 // Acquire the clipboard. | 424 // Acquire the clipboard. |
| 428 ScopedClipboard clipboard; | 425 ScopedClipboard clipboard; |
| 429 if (!clipboard.Acquire(clipboard_owner_)) | 426 if (!clipboard.Acquire(GetClipboardWindow())) |
| 430 return; | 427 return; |
| 431 | 428 |
| 432 HANDLE data = ::GetClipboardData(GetHtmlFormatType()); | 429 HANDLE data = ::GetClipboardData(GetHtmlFormatType()); |
| 433 if (!data) | 430 if (!data) |
| 434 return; | 431 return; |
| 435 | 432 |
| 436 std::string html_fragment(static_cast<const char*>(::GlobalLock(data))); | 433 std::string html_fragment(static_cast<const char*>(::GlobalLock(data))); |
| 437 ::GlobalUnlock(data); | 434 ::GlobalUnlock(data); |
| 438 | 435 |
| 439 std::string markup_utf8; | 436 std::string markup_utf8; |
| 440 ClipboardUtil::CFHtmlToHtml(html_fragment, &markup_utf8, src_url); | 437 ClipboardUtil::CFHtmlToHtml(html_fragment, &markup_utf8, src_url); |
| 441 markup->assign(UTF8ToWide(markup_utf8)); | 438 markup->assign(UTF8ToWide(markup_utf8)); |
| 442 } | 439 } |
| 443 | 440 |
| 444 void Clipboard::ReadBookmark(std::wstring* title, std::string* url) const { | 441 void Clipboard::ReadBookmark(std::wstring* title, std::string* url) const { |
| 445 if (title) | 442 if (title) |
| 446 title->clear(); | 443 title->clear(); |
| 447 | 444 |
| 448 if (url) | 445 if (url) |
| 449 url->clear(); | 446 url->clear(); |
| 450 | 447 |
| 451 // Acquire the clipboard. | 448 // Acquire the clipboard. |
| 452 ScopedClipboard clipboard; | 449 ScopedClipboard clipboard; |
| 453 if (!clipboard.Acquire(clipboard_owner_)) | 450 if (!clipboard.Acquire(GetClipboardWindow())) |
| 454 return; | 451 return; |
| 455 | 452 |
| 456 HANDLE data = ::GetClipboardData(GetUrlWFormatType()); | 453 HANDLE data = ::GetClipboardData(GetUrlWFormatType()); |
| 457 if (!data) | 454 if (!data) |
| 458 return; | 455 return; |
| 459 | 456 |
| 460 std::wstring bookmark(static_cast<const wchar_t*>(::GlobalLock(data))); | 457 std::wstring bookmark(static_cast<const wchar_t*>(::GlobalLock(data))); |
| 461 ::GlobalUnlock(data); | 458 ::GlobalUnlock(data); |
| 462 | 459 |
| 463 ParseBookmarkClipboardFormat(bookmark, title, url); | 460 ParseBookmarkClipboardFormat(bookmark, title, url); |
| (...skipping 18 matching lines...) Expand all Loading... |
| 482 // Read a set of files in HDROP format from the clipboard. | 479 // Read a set of files in HDROP format from the clipboard. |
| 483 void Clipboard::ReadFiles(std::vector<std::wstring>* files) const { | 480 void Clipboard::ReadFiles(std::vector<std::wstring>* files) const { |
| 484 if (!files) { | 481 if (!files) { |
| 485 NOTREACHED(); | 482 NOTREACHED(); |
| 486 return; | 483 return; |
| 487 } | 484 } |
| 488 | 485 |
| 489 files->clear(); | 486 files->clear(); |
| 490 | 487 |
| 491 ScopedClipboard clipboard; | 488 ScopedClipboard clipboard; |
| 492 if (!clipboard.Acquire(clipboard_owner_)) | 489 if (!clipboard.Acquire(GetClipboardWindow())) |
| 493 return; | 490 return; |
| 494 | 491 |
| 495 HDROP drop = static_cast<HDROP>(::GetClipboardData(CF_HDROP)); | 492 HDROP drop = static_cast<HDROP>(::GetClipboardData(CF_HDROP)); |
| 496 if (!drop) | 493 if (!drop) |
| 497 return; | 494 return; |
| 498 | 495 |
| 499 // Count of files in the HDROP. | 496 // Count of files in the HDROP. |
| 500 int count = ::DragQueryFile(drop, 0xffffffff, NULL, 0); | 497 int count = ::DragQueryFile(drop, 0xffffffff, NULL, 0); |
| 501 | 498 |
| 502 if (count) { | 499 if (count) { |
| (...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 598 return ClipboardUtil::GetWebKitSmartPasteFormat()->cfFormat; | 595 return ClipboardUtil::GetWebKitSmartPasteFormat()->cfFormat; |
| 599 } | 596 } |
| 600 | 597 |
| 601 // static | 598 // static |
| 602 void Clipboard::FreeData(FormatType format, HANDLE data) { | 599 void Clipboard::FreeData(FormatType format, HANDLE data) { |
| 603 if (format == CF_BITMAP) | 600 if (format == CF_BITMAP) |
| 604 ::DeleteObject(static_cast<HBITMAP>(data)); | 601 ::DeleteObject(static_cast<HBITMAP>(data)); |
| 605 else | 602 else |
| 606 ::GlobalFree(data); | 603 ::GlobalFree(data); |
| 607 } | 604 } |
| 605 |
| 606 HWND Clipboard::GetClipboardWindow() const { |
| 607 if (!clipboard_owner_) { |
| 608 clipboard_owner_ = ::CreateWindow(L"ClipboardOwnerWindowClass", |
| 609 L"ClipboardOwnerWindow", |
| 610 0, 0, 0, 0, 0, |
| 611 HWND_MESSAGE, |
| 612 0, 0, 0); |
| 613 } |
| 614 return clipboard_owner_; |
| 615 } |
| OLD | NEW |