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 | 214 |
1 files changed, 214 insertions, 0 deletions
diff --git a/chromium/ui/base/clipboard/clipboard_format_type_win.cc b/chromium/ui/base/clipboard/clipboard_format_type_win.cc new file mode 100644 index 00000000000..ebb4ba850bb --- /dev/null +++ b/chromium/ui/base/clipboard/clipboard_format_type_win.cc @@ -0,0 +1,214 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "ui/base/clipboard/clipboard_format_type.h" + +#include <shlobj.h> + +#include "base/lazy_instance.h" +#include "base/logging.h" +#include "base/strings/string_number_conversions.h" +#include "base/strings/utf_string_conversions.h" + +namespace ui { + +// ClipboardFormatType implementation. +ClipboardFormatType::ClipboardFormatType() : data_() {} + +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, 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::~ClipboardFormatType() {} + +std::string ClipboardFormatType::Serialize() const { + return base::IntToString(data_.cfFormat); +} + +// static +ClipboardFormatType ClipboardFormatType::Deserialize( + const std::string& serialization) { + int clipboard_format = -1; + if (!base::StringToInt(serialization, &clipboard_format)) { + NOTREACHED(); + return ClipboardFormatType(); + } + return ClipboardFormatType(clipboard_format); +} + +bool ClipboardFormatType::operator<(const ClipboardFormatType& other) const { + return data_.cfFormat < other.data_.cfFormat; +} + +bool ClipboardFormatType::Equals(const ClipboardFormatType& other) const { + return data_.cfFormat == other.data_.cfFormat; +} + +// Various predefined ClipboardFormatTypes. + +// static +ClipboardFormatType ClipboardFormatType::GetType( + const std::string& format_string) { + return ClipboardFormatType( + ::RegisterClipboardFormat(base::ASCIIToUTF16(format_string).c_str())); +} + +// The following formats can be referenced by ClipboardUtilWin::GetPlainText. +// For reasons (COM), they must be initialized in a thread-safe manner. +// TODO(dcheng): We probably need to make static initialization of "known" +// ClipboardFormatTypes thread-safe on all platforms. +#define CR_STATIC_UI_CLIPBOARD_FORMAT_TYPE(name, ...) \ + struct ClipboardFormatTypeArgumentForwarder : public ClipboardFormatType { \ + ClipboardFormatTypeArgumentForwarder() \ + : ClipboardFormatType(__VA_ARGS__) {} \ + }; \ + static base::LazyInstance<ClipboardFormatTypeArgumentForwarder>::Leaky \ + name = LAZY_INSTANCE_INITIALIZER + +// static +const ClipboardFormatType& ClipboardFormatType::GetUrlType() { + CR_STATIC_UI_CLIPBOARD_FORMAT_TYPE(type, + ::RegisterClipboardFormat(CFSTR_INETURLA)); + return type.Get(); +} + +// static +const ClipboardFormatType& ClipboardFormatType::GetUrlWType() { + CR_STATIC_UI_CLIPBOARD_FORMAT_TYPE(type, + ::RegisterClipboardFormat(CFSTR_INETURLW)); + return type.Get(); +} + +// static +const ClipboardFormatType& ClipboardFormatType::GetMozUrlType() { + CR_STATIC_UI_CLIPBOARD_FORMAT_TYPE( + type, ::RegisterClipboardFormat(L"text/x-moz-url")); + return type.Get(); +} + +// static +const ClipboardFormatType& ClipboardFormatType::GetPlainTextType() { + CR_STATIC_UI_CLIPBOARD_FORMAT_TYPE(type, CF_TEXT); + return type.Get(); +} + +// static +const ClipboardFormatType& ClipboardFormatType::GetPlainTextWType() { + CR_STATIC_UI_CLIPBOARD_FORMAT_TYPE(type, CF_UNICODETEXT); + return type.Get(); +} + +// static +const ClipboardFormatType& ClipboardFormatType::GetFilenameType() { + CR_STATIC_UI_CLIPBOARD_FORMAT_TYPE( + type, ::RegisterClipboardFormat(CFSTR_FILENAMEA)); + return type.Get(); +} + +// static +const ClipboardFormatType& ClipboardFormatType::GetFilenameWType() { + CR_STATIC_UI_CLIPBOARD_FORMAT_TYPE( + type, ::RegisterClipboardFormat(CFSTR_FILENAMEW)); + return type.Get(); +} + +// MS HTML Format + +// static +const ClipboardFormatType& ClipboardFormatType::GetHtmlType() { + CR_STATIC_UI_CLIPBOARD_FORMAT_TYPE(type, + ::RegisterClipboardFormat(L"HTML Format")); + return type.Get(); +} + +// MS RTF Format + +// static +const ClipboardFormatType& ClipboardFormatType::GetRtfType() { + CR_STATIC_UI_CLIPBOARD_FORMAT_TYPE( + type, ::RegisterClipboardFormat(L"Rich Text Format")); + return type.Get(); +} + +// static +const ClipboardFormatType& ClipboardFormatType::GetBitmapType() { + CR_STATIC_UI_CLIPBOARD_FORMAT_TYPE(type, CF_BITMAP); + return type.Get(); +} + +// Firefox text/html + +// static +const ClipboardFormatType& ClipboardFormatType::GetTextHtmlType() { + CR_STATIC_UI_CLIPBOARD_FORMAT_TYPE(type, + ::RegisterClipboardFormat(L"text/html")); + return type.Get(); +} + +// static +const ClipboardFormatType& ClipboardFormatType::GetCFHDropType() { + CR_STATIC_UI_CLIPBOARD_FORMAT_TYPE(type, CF_HDROP); + return type.Get(); +} + +// static +const ClipboardFormatType& ClipboardFormatType::GetFileDescriptorType() { + CR_STATIC_UI_CLIPBOARD_FORMAT_TYPE( + type, ::RegisterClipboardFormat(CFSTR_FILEDESCRIPTOR)); + return type.Get(); +} + +// static +const ClipboardFormatType& ClipboardFormatType::GetFileContentZeroType() { + CR_STATIC_UI_CLIPBOARD_FORMAT_TYPE( + type, ::RegisterClipboardFormat(CFSTR_FILECONTENTS), 0); + return type.Get(); +} + +// static +const ClipboardFormatType& ClipboardFormatType::GetIDListType() { + CR_STATIC_UI_CLIPBOARD_FORMAT_TYPE( + type, ::RegisterClipboardFormat(CFSTR_SHELLIDLIST)); + return type.Get(); +} + +// static +const ClipboardFormatType& ClipboardFormatType::GetWebKitSmartPasteType() { + CR_STATIC_UI_CLIPBOARD_FORMAT_TYPE( + type, ::RegisterClipboardFormat(L"WebKit Smart Paste Format")); + return type.Get(); +} + +// static +const ClipboardFormatType& ClipboardFormatType::GetWebCustomDataType() { + // TODO(dcheng): This name is temporary. See http://crbug.com/106449. + CR_STATIC_UI_CLIPBOARD_FORMAT_TYPE( + type, ::RegisterClipboardFormat(L"Chromium Web Custom MIME Data Format")); + return type.Get(); +} + +// static +const ClipboardFormatType& ClipboardFormatType::GetPepperCustomDataType() { + CR_STATIC_UI_CLIPBOARD_FORMAT_TYPE( + type, ::RegisterClipboardFormat(L"Chromium Pepper MIME Data Format")); + return type.Get(); +} +#undef CR_STATIC_UI_CLIPBOARD_FORMAT_TYPE + +} // namespace ui |