diff options
Diffstat (limited to 'chromium/ui/base/clipboard/clipboard_format_type_win.cc')
-rw-r--r-- | chromium/ui/base/clipboard/clipboard_format_type_win.cc | 74 |
1 files changed, 55 insertions, 19 deletions
diff --git a/chromium/ui/base/clipboard/clipboard_format_type_win.cc b/chromium/ui/base/clipboard/clipboard_format_type_win.cc index 86e7d916c8d..bb242e0af5f 100644 --- a/chromium/ui/base/clipboard/clipboard_format_type_win.cc +++ b/chromium/ui/base/clipboard/clipboard_format_type_win.cc @@ -8,34 +8,30 @@ #include "base/lazy_instance.h" #include "base/logging.h" +#include "base/memory/ptr_util.h" #include "base/strings/string_number_conversions.h" #include "base/strings/utf_string_conversions.h" namespace ui { // ClipboardFormatType implementation. -ClipboardFormatType::ClipboardFormatType() : data_() {} +ClipboardFormatType::ClipboardFormatType() = default; -ClipboardFormatType::ClipboardFormatType(UINT native_format) : data_() { - // There's no good way to actually initialize this in the constructor in - // C++03. - data_.cfFormat = static_cast<CLIPFORMAT>(native_format); - data_.dwAspect = DVASPECT_CONTENT; - data_.lindex = -1; - data_.tymed = TYMED_HGLOBAL; -} +ClipboardFormatType::ClipboardFormatType(UINT native_format) + : ClipboardFormatType(native_format, -1) {} ClipboardFormatType::ClipboardFormatType(UINT native_format, LONG index) - : data_() { - // There's no good way to actually initialize this in the constructor in - // C++03. - data_.cfFormat = static_cast<CLIPFORMAT>(native_format); - data_.dwAspect = DVASPECT_CONTENT; - data_.lindex = index; - data_.tymed = TYMED_HGLOBAL; -} + : ClipboardFormatType(native_format, index, TYMED_HGLOBAL) {} -ClipboardFormatType::~ClipboardFormatType() {} +// In C++ 20, we can use designated initializers. +ClipboardFormatType::ClipboardFormatType(UINT native_format, + LONG index, + DWORD tymed) + : data_{/* .cfFormat */ static_cast<CLIPFORMAT>(native_format), + /* .ptd */ nullptr, /* .dwAspect */ DVASPECT_CONTENT, + /* .lindex */ index, /* .tymed*/ tymed} {} + +ClipboardFormatType::~ClipboardFormatType() = default; std::string ClipboardFormatType::Serialize() const { return base::NumberToString(data_.cfFormat); @@ -167,21 +163,61 @@ const ClipboardFormatType& ClipboardFormatType::GetCFHDropType() { return type.Get(); } +// Nothing prevents the drag source app from using the CFSTR_FILEDESCRIPTORA +// ANSI format (e.g., it could be that it doesn't support UNICODE). So need to +// register both the ANSI and UNICODE file group descriptors. // static const ClipboardFormatType& ClipboardFormatType::GetFileDescriptorType() { CR_STATIC_UI_CLIPBOARD_FORMAT_TYPE( - type, ::RegisterClipboardFormat(CFSTR_FILEDESCRIPTOR)); + type, ::RegisterClipboardFormat(CFSTR_FILEDESCRIPTORA)); + return type.Get(); +} + +// static +const ClipboardFormatType& ClipboardFormatType::GetFileDescriptorWType() { + CR_STATIC_UI_CLIPBOARD_FORMAT_TYPE( + type, ::RegisterClipboardFormat(CFSTR_FILEDESCRIPTORW)); return type.Get(); } // static const ClipboardFormatType& ClipboardFormatType::GetFileContentZeroType() { + // Note this uses a storage media type of TYMED_HGLOBAL, which is not commonly + // used with CFSTR_FILECONTENTS (but used in Chromium--see + // OSExchangeDataProviderWin::SetFileContents). Use GetFileContentAtIndexType + // if TYMED_ISTREAM and TYMED_ISTORAGE are needed. + // TODO(https://crbug.com/950756): Should TYMED_ISTREAM / TYMED_ISTORAGE be + // used instead of TYMED_HGLOBAL in + // OSExchangeDataProviderWin::SetFileContents. CR_STATIC_UI_CLIPBOARD_FORMAT_TYPE( type, ::RegisterClipboardFormat(CFSTR_FILECONTENTS), 0); return type.Get(); } // static +std::map<LONG, ClipboardFormatType>& +ClipboardFormatType::GetFileContentTypeMap() { + static base::NoDestructor<std::map<LONG, ClipboardFormatType>> + index_to_type_map; + return *index_to_type_map; +} + +// static +const ClipboardFormatType& ClipboardFormatType::GetFileContentAtIndexType( + LONG index) { + auto& index_to_type_map = GetFileContentTypeMap(); + + // Use base::WrapUnique instead of std::make_unique here since + // ClipboardFormatType constructor is private. See + // https://chromium.googlesource.com/chromium/src/+/HEAD/styleguide/c++/c++-dos-and-donts.md. + auto insert_or_assign_result = index_to_type_map.insert( + {index, + ClipboardFormatType(::RegisterClipboardFormat(CFSTR_FILECONTENTS), index, + TYMED_HGLOBAL | TYMED_ISTREAM | TYMED_ISTORAGE)}); + return insert_or_assign_result.first->second; +} + +// static const ClipboardFormatType& ClipboardFormatType::GetIDListType() { CR_STATIC_UI_CLIPBOARD_FORMAT_TYPE( type, ::RegisterClipboardFormat(CFSTR_SHELLIDLIST)); |