| Index: ui/base/clipboard/clipboard_win.cc
|
| diff --git a/ui/base/clipboard/clipboard_win.cc b/ui/base/clipboard/clipboard_win.cc
|
| index 776ff4d2540de6a38764410073ccd527928c20aa..79a0faab026e64937747502614f4d9c0b422f513 100644
|
| --- a/ui/base/clipboard/clipboard_win.cc
|
| +++ b/ui/base/clipboard/clipboard_win.cc
|
| @@ -10,13 +10,14 @@
|
| #include <shlobj.h>
|
| #include <shellapi.h>
|
|
|
| +#include "base/basictypes.h"
|
| #include "base/file_path.h"
|
| #include "base/logging.h"
|
| #include "base/message_loop.h"
|
| #include "base/shared_memory.h"
|
| #include "base/stl_util.h"
|
| -#include "base/string_util.h"
|
| #include "base/string_number_conversions.h"
|
| +#include "base/string_util.h"
|
| #include "base/utf_offset_string_conversions.h"
|
| #include "base/utf_string_conversions.h"
|
| #include "base/win/scoped_gdi_object.h"
|
| @@ -159,6 +160,30 @@ void MakeBitmapOpaque(const SkBitmap& bitmap) {
|
|
|
| } // namespace
|
|
|
| +Clipboard::FormatType::FormatType() {
|
| +}
|
| +
|
| +Clipboard::FormatType::FormatType(UINT native_format) : data_(native_format) {
|
| +}
|
| +
|
| +Clipboard::FormatType::~FormatType() {
|
| +}
|
| +
|
| +std::string Clipboard::FormatType::Serialize() const {
|
| + return base::IntToString(data_);
|
| +}
|
| +
|
| +// static
|
| +Clipboard::FormatType Clipboard::FormatType::Deserialize(
|
| + const std::string& serialization) {
|
| + int clipboard_format = -1;
|
| + if (!base::StringToInt(serialization, &clipboard_format)) {
|
| + NOTREACHED();
|
| + return FormatType();
|
| + }
|
| + return FormatType(clipboard_format);
|
| +}
|
| +
|
| Clipboard::Clipboard() : create_window_(false) {
|
| if (MessageLoop::current()->type() == MessageLoop::TYPE_UI) {
|
| // Make a dummy HWND to be the clipboard's owner.
|
| @@ -314,12 +339,9 @@ void Clipboard::WriteBitmapFromHandle(HBITMAP source_hbitmap,
|
| WriteToClipboard(CF_BITMAP, hbitmap);
|
| }
|
|
|
| -void Clipboard::WriteData(const char* format_name, size_t format_len,
|
| - const char* data_data, size_t data_len) {
|
| - std::string format(format_name, format_len);
|
| - CLIPFORMAT clip_format =
|
| - ::RegisterClipboardFormat(ASCIIToWide(format).c_str());
|
| -
|
| +void Clipboard::WriteData(const FormatType& format,
|
| + const char* data_data,
|
| + size_t data_len) {
|
| HGLOBAL hdata = ::GlobalAlloc(GMEM_MOVEABLE, data_len);
|
| if (!hdata)
|
| return;
|
| @@ -327,7 +349,7 @@ void Clipboard::WriteData(const char* format_name, size_t format_len,
|
| char* data = static_cast<char*>(::GlobalLock(hdata));
|
| memcpy(data, data_data, data_len);
|
| ::GlobalUnlock(data);
|
| - WriteToClipboard(clip_format, hdata);
|
| + WriteToClipboard(format.ToUINT(), hdata);
|
| }
|
|
|
| void Clipboard::WriteToClipboard(unsigned int format, HANDLE handle) {
|
| @@ -346,18 +368,7 @@ uint64 Clipboard::GetSequenceNumber(Buffer buffer) {
|
| bool Clipboard::IsFormatAvailable(const Clipboard::FormatType& format,
|
| Clipboard::Buffer buffer) const {
|
| DCHECK_EQ(buffer, BUFFER_STANDARD);
|
| - int f;
|
| - if (!base::StringToInt(format, &f))
|
| - return false;
|
| - return ::IsClipboardFormatAvailable(f) != FALSE;
|
| -}
|
| -
|
| -bool Clipboard::IsFormatAvailableByString(
|
| - const std::string& ascii_format, Clipboard::Buffer buffer) const {
|
| - DCHECK_EQ(buffer, BUFFER_STANDARD);
|
| - std::wstring wide_format = ASCIIToWide(ascii_format);
|
| - CLIPFORMAT format = ::RegisterClipboardFormat(wide_format.c_str());
|
| - return ::IsClipboardFormatAvailable(format) != FALSE;
|
| + return ::IsClipboardFormatAvailable(format.ToUINT()) != FALSE;
|
| }
|
|
|
| void Clipboard::ReadAvailableTypes(Clipboard::Buffer buffer,
|
| @@ -646,20 +657,17 @@ void Clipboard::ReadFiles(std::vector<FilePath>* files) const {
|
| }
|
| }
|
|
|
| -void Clipboard::ReadData(const std::string& format, std::string* result) const {
|
| +void Clipboard::ReadData(const FormatType& format, std::string* result) const {
|
| if (!result) {
|
| NOTREACHED();
|
| return;
|
| }
|
|
|
| - CLIPFORMAT clip_format =
|
| - ::RegisterClipboardFormat(ASCIIToWide(format).c_str());
|
| -
|
| ScopedClipboard clipboard;
|
| if (!clipboard.Acquire(GetClipboardWindow()))
|
| return;
|
|
|
| - HANDLE data = ::GetClipboardData(clip_format);
|
| + HANDLE data = ::GetClipboardData(format.ToUINT());
|
| if (!data)
|
| return;
|
|
|
| @@ -686,86 +694,145 @@ void Clipboard::ParseBookmarkClipboardFormat(const string16& bookmark,
|
| }
|
|
|
| // static
|
| -Clipboard::FormatType Clipboard::GetUrlFormatType() {
|
| - return base::IntToString(ClipboardUtil::GetUrlFormat()->cfFormat);
|
| +Clipboard::FormatType Clipboard::GetFormatType(
|
| + const std::string& format_string) {
|
| + return FormatType(
|
| + ::RegisterClipboardFormat(ASCIIToWide(format_string).c_str()));
|
| +}
|
| +
|
| +// static
|
| +// TODO(dcheng): Just substitue the appropriate constants here.
|
| +const Clipboard::FormatType& Clipboard::GetUrlFormatType() {
|
| + CR_DEFINE_STATIC_LOCAL(
|
| + FormatType,
|
| + type,
|
| + (ClipboardUtil::GetUrlFormat()->cfFormat));
|
| + return type;
|
| }
|
|
|
| // static
|
| -Clipboard::FormatType Clipboard::GetUrlWFormatType() {
|
| - return base::IntToString(ClipboardUtil::GetUrlWFormat()->cfFormat);
|
| +const Clipboard::FormatType& Clipboard::GetUrlWFormatType() {
|
| + CR_DEFINE_STATIC_LOCAL(
|
| + FormatType,
|
| + type,
|
| + (ClipboardUtil::GetUrlWFormat()->cfFormat));
|
| + return type;
|
| }
|
|
|
| // static
|
| -Clipboard::FormatType Clipboard::GetMozUrlFormatType() {
|
| - return base::IntToString(ClipboardUtil::GetMozUrlFormat()->cfFormat);
|
| +const Clipboard::FormatType& Clipboard::GetMozUrlFormatType() {
|
| + CR_DEFINE_STATIC_LOCAL(
|
| + FormatType,
|
| + type,
|
| + (ClipboardUtil::GetMozUrlFormat()->cfFormat));
|
| + return type;
|
| }
|
|
|
| // static
|
| -Clipboard::FormatType Clipboard::GetPlainTextFormatType() {
|
| - return base::IntToString(ClipboardUtil::GetPlainTextFormat()->cfFormat);
|
| +const Clipboard::FormatType& Clipboard::GetPlainTextFormatType() {
|
| + CR_DEFINE_STATIC_LOCAL(
|
| + FormatType,
|
| + type,
|
| + (ClipboardUtil::GetPlainTextFormat()->cfFormat));
|
| + return type;
|
| }
|
|
|
| // static
|
| -Clipboard::FormatType Clipboard::GetPlainTextWFormatType() {
|
| - return base::IntToString(ClipboardUtil::GetPlainTextWFormat()->cfFormat);
|
| +const Clipboard::FormatType& Clipboard::GetPlainTextWFormatType() {
|
| + CR_DEFINE_STATIC_LOCAL(
|
| + FormatType,
|
| + type,
|
| + (ClipboardUtil::GetPlainTextWFormat()->cfFormat));
|
| + return type;
|
| }
|
|
|
| // static
|
| -Clipboard::FormatType Clipboard::GetFilenameFormatType() {
|
| - return base::IntToString(ClipboardUtil::GetFilenameFormat()->cfFormat);
|
| +const Clipboard::FormatType& Clipboard::GetFilenameFormatType() {
|
| + CR_DEFINE_STATIC_LOCAL(
|
| + FormatType,
|
| + type,
|
| + (ClipboardUtil::GetFilenameFormat()->cfFormat));
|
| + return type;
|
| }
|
|
|
| // static
|
| -Clipboard::FormatType Clipboard::GetFilenameWFormatType() {
|
| - return base::IntToString(ClipboardUtil::GetFilenameWFormat()->cfFormat);
|
| +const Clipboard::FormatType& Clipboard::GetFilenameWFormatType() {
|
| + CR_DEFINE_STATIC_LOCAL(
|
| + FormatType,
|
| + type,
|
| + (ClipboardUtil::GetFilenameWFormat()->cfFormat));
|
| + return type;
|
| }
|
|
|
| // MS HTML Format
|
| // static
|
| -Clipboard::FormatType Clipboard::GetHtmlFormatType() {
|
| - return base::IntToString(ClipboardUtil::GetHtmlFormat()->cfFormat);
|
| +const Clipboard::FormatType& Clipboard::GetHtmlFormatType() {
|
| + CR_DEFINE_STATIC_LOCAL(
|
| + FormatType,
|
| + type,
|
| + (ClipboardUtil::GetHtmlFormat()->cfFormat));
|
| + return type;
|
| }
|
|
|
| // static
|
| -Clipboard::FormatType Clipboard::GetBitmapFormatType() {
|
| - return base::IntToString(CF_BITMAP);
|
| +const Clipboard::FormatType& Clipboard::GetBitmapFormatType() {
|
| + CR_DEFINE_STATIC_LOCAL(FormatType, type, (CF_BITMAP));
|
| + return type;
|
| }
|
|
|
| // Firefox text/html
|
| // static
|
| -Clipboard::FormatType Clipboard::GetTextHtmlFormatType() {
|
| - return base::IntToString(ClipboardUtil::GetTextHtmlFormat()->cfFormat);
|
| +const Clipboard::FormatType& Clipboard::GetTextHtmlFormatType() {
|
| + CR_DEFINE_STATIC_LOCAL(
|
| + FormatType,
|
| + type,
|
| + (ClipboardUtil::GetTextHtmlFormat()->cfFormat));
|
| + return type;
|
| }
|
|
|
| // static
|
| -Clipboard::FormatType Clipboard::GetCFHDropFormatType() {
|
| - return base::IntToString(ClipboardUtil::GetCFHDropFormat()->cfFormat);
|
| +const Clipboard::FormatType& Clipboard::GetCFHDropFormatType() {
|
| + CR_DEFINE_STATIC_LOCAL(
|
| + FormatType,
|
| + type,
|
| + (ClipboardUtil::GetCFHDropFormat()->cfFormat));
|
| + return type;
|
| }
|
|
|
| // static
|
| -Clipboard::FormatType Clipboard::GetFileDescriptorFormatType() {
|
| - return base::IntToString(ClipboardUtil::GetFileDescriptorFormat()->cfFormat);
|
| +const Clipboard::FormatType& Clipboard::GetFileDescriptorFormatType() {
|
| + CR_DEFINE_STATIC_LOCAL(
|
| + FormatType,
|
| + type,
|
| + (ClipboardUtil::GetFileDescriptorFormat()->cfFormat));
|
| + return type;
|
| }
|
|
|
| // static
|
| -Clipboard::FormatType Clipboard::GetFileContentFormatZeroType() {
|
| - return base::IntToString(ClipboardUtil::GetFileContentFormatZero()->cfFormat);
|
| +const Clipboard::FormatType& Clipboard::GetFileContentFormatZeroType() {
|
| + CR_DEFINE_STATIC_LOCAL(
|
| + FormatType,
|
| + type,
|
| + (ClipboardUtil::GetFileContentFormatZero()->cfFormat));
|
| + return type;
|
| }
|
|
|
| // static
|
| -Clipboard::FormatType Clipboard::GetWebKitSmartPasteFormatType() {
|
| - return base::IntToString(
|
| - ClipboardUtil::GetWebKitSmartPasteFormat()->cfFormat);
|
| +const Clipboard::FormatType& Clipboard::GetWebKitSmartPasteFormatType() {
|
| + CR_DEFINE_STATIC_LOCAL(
|
| + FormatType,
|
| + type,
|
| + (ClipboardUtil::GetWebKitSmartPasteFormat()->cfFormat));
|
| + return type;
|
| }
|
|
|
| // static
|
| -Clipboard::FormatType Clipboard::GetWebCustomDataFormatType() {
|
| - // TODO(dcheng): Clean up the duplicated constant.
|
| - // Clipboard::WritePickledData() takes a FormatType, but all the callers
|
| - // assume that it's a raw string. As a result, we return the format name here
|
| - // rather than returning a string-ified version of the registered clipboard
|
| - // format ID.
|
| - return "Chromium Web Custom MIME Data Format";
|
| +const Clipboard::FormatType& Clipboard::GetWebCustomDataFormatType() {
|
| + CR_DEFINE_STATIC_LOCAL(
|
| + FormatType,
|
| + type,
|
| + (ClipboardUtil::GetWebCustomDataFormat()->cfFormat));
|
| + return type;
|
| }
|
|
|
| // static
|
|
|