summaryrefslogtreecommitdiff
path: root/chromium/ui/base/clipboard/clipboard_format_type_win.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/ui/base/clipboard/clipboard_format_type_win.cc')
-rw-r--r--chromium/ui/base/clipboard/clipboard_format_type_win.cc74
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));