Commit 46c0324e authored by Darwin Huang's avatar Darwin Huang Committed by Commit Bot

Windows Clipboard: Replace base::LazyInstance<T>::Leaky with base::NoDestructor<T>.

static initialization is thread-safe, since C++11, and base::LazyInstance is
deprecated[1]. Therefore, remove use of base::LazyInstance. This also provides
the opportunity to remove a preprocessor macro. This CL also fixes
TestURLExchangeFormatsViaCOM, which was using an incorrect FORMATETC argument.

[1]: https://cs.chromium.org/chromium/src/base/lazy_instance.h?rcl=82bf98cd15cedc12558f475feb6770f0c9d903ea&l=5

Bug: 800760
Change-Id: Ib902ca5f7660c609f74c2681a9bf96cb828be52c
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1764890
Commit-Queue: Darwin Huang <huangdarwin@chromium.org>
Auto-Submit: Darwin Huang <huangdarwin@chromium.org>
Reviewed-by: default avatarScott Violet <sky@chromium.org>
Reviewed-by: default avatarDaniel Cheng <dcheng@chromium.org>
Reviewed-by: default avatarVictor Costan <pwnall@chromium.org>
Cr-Commit-Position: refs/heads/master@{#690442}
parent 48104db6
...@@ -6,9 +6,9 @@ ...@@ -6,9 +6,9 @@
#include <shlobj.h> #include <shlobj.h>
#include "base/lazy_instance.h"
#include "base/logging.h" #include "base/logging.h"
#include "base/memory/ptr_util.h" #include "base/memory/ptr_util.h"
#include "base/no_destructor.h"
#include "base/strings/string_number_conversions.h" #include "base/strings/string_number_conversions.h"
#include "base/strings/utf_string_conversions.h" #include "base/strings/utf_string_conversions.h"
...@@ -66,101 +66,95 @@ ClipboardFormatType ClipboardFormatType::GetType( ...@@ -66,101 +66,95 @@ ClipboardFormatType ClipboardFormatType::GetType(
} }
// The following formats can be referenced by ClipboardUtilWin::GetPlainText. // The following formats can be referenced by ClipboardUtilWin::GetPlainText.
// For reasons (COM), they must be initialized in a thread-safe manner. // Clipboard formats are initialized in a thread-safe manner, using static
// initialization. COM requires this thread-safe initialization.
// TODO(dcheng): We probably need to make static initialization of "known" // TODO(dcheng): We probably need to make static initialization of "known"
// ClipboardFormatTypes thread-safe on all platforms. // 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 // static
const ClipboardFormatType& ClipboardFormatType::GetUrlType() { const ClipboardFormatType& ClipboardFormatType::GetUrlType() {
CR_STATIC_UI_CLIPBOARD_FORMAT_TYPE(type, static base::NoDestructor<ClipboardFormatType> format(
::RegisterClipboardFormat(CFSTR_INETURLA)); ::RegisterClipboardFormat(CFSTR_INETURLA));
return type.Get(); return *format;
} }
// static // static
const ClipboardFormatType& ClipboardFormatType::GetUrlWType() { const ClipboardFormatType& ClipboardFormatType::GetUrlWType() {
CR_STATIC_UI_CLIPBOARD_FORMAT_TYPE(type, static base::NoDestructor<ClipboardFormatType> format(
::RegisterClipboardFormat(CFSTR_INETURLW)); ::RegisterClipboardFormat(CFSTR_INETURLW));
return type.Get(); return *format;
} }
// static // static
const ClipboardFormatType& ClipboardFormatType::GetMozUrlType() { const ClipboardFormatType& ClipboardFormatType::GetMozUrlType() {
CR_STATIC_UI_CLIPBOARD_FORMAT_TYPE( static base::NoDestructor<ClipboardFormatType> format(
type, ::RegisterClipboardFormat(L"text/x-moz-url")); ::RegisterClipboardFormat(L"text/x-moz-url"));
return type.Get(); return *format;
} }
// static // static
const ClipboardFormatType& ClipboardFormatType::GetPlainTextType() { const ClipboardFormatType& ClipboardFormatType::GetPlainTextType() {
CR_STATIC_UI_CLIPBOARD_FORMAT_TYPE(type, CF_TEXT); static base::NoDestructor<ClipboardFormatType> format(CF_TEXT);
return type.Get(); return *format;
} }
// static // static
const ClipboardFormatType& ClipboardFormatType::GetPlainTextWType() { const ClipboardFormatType& ClipboardFormatType::GetPlainTextWType() {
CR_STATIC_UI_CLIPBOARD_FORMAT_TYPE(type, CF_UNICODETEXT); static base::NoDestructor<ClipboardFormatType> format(CF_UNICODETEXT);
return type.Get(); return *format;
} }
// static // static
const ClipboardFormatType& ClipboardFormatType::GetFilenameType() { const ClipboardFormatType& ClipboardFormatType::GetFilenameType() {
CR_STATIC_UI_CLIPBOARD_FORMAT_TYPE( static base::NoDestructor<ClipboardFormatType> format(
type, ::RegisterClipboardFormat(CFSTR_FILENAMEA)); ::RegisterClipboardFormat(CFSTR_FILENAMEA));
return type.Get(); return *format;
} }
// static // static
const ClipboardFormatType& ClipboardFormatType::GetFilenameWType() { const ClipboardFormatType& ClipboardFormatType::GetFilenameWType() {
CR_STATIC_UI_CLIPBOARD_FORMAT_TYPE( static base::NoDestructor<ClipboardFormatType> format(
type, ::RegisterClipboardFormat(CFSTR_FILENAMEW)); ::RegisterClipboardFormat(CFSTR_FILENAMEW));
return type.Get(); return *format;
} }
// MS HTML Format // MS HTML Format
// static // static
const ClipboardFormatType& ClipboardFormatType::GetHtmlType() { const ClipboardFormatType& ClipboardFormatType::GetHtmlType() {
CR_STATIC_UI_CLIPBOARD_FORMAT_TYPE(type, static base::NoDestructor<ClipboardFormatType> format(
::RegisterClipboardFormat(L"HTML Format")); ::RegisterClipboardFormat(L"HTML Format"));
return type.Get(); return *format;
} }
// MS RTF Format // MS RTF Format
// static // static
const ClipboardFormatType& ClipboardFormatType::GetRtfType() { const ClipboardFormatType& ClipboardFormatType::GetRtfType() {
CR_STATIC_UI_CLIPBOARD_FORMAT_TYPE( static base::NoDestructor<ClipboardFormatType> format(
type, ::RegisterClipboardFormat(L"Rich Text Format")); ::RegisterClipboardFormat(L"Rich Text Format"));
return type.Get(); return *format;
} }
// static // static
const ClipboardFormatType& ClipboardFormatType::GetBitmapType() { const ClipboardFormatType& ClipboardFormatType::GetBitmapType() {
CR_STATIC_UI_CLIPBOARD_FORMAT_TYPE(type, CF_BITMAP); static base::NoDestructor<ClipboardFormatType> format(CF_BITMAP);
return type.Get(); return *format;
} }
// Firefox text/html // Firefox text/html
// static // static
const ClipboardFormatType& ClipboardFormatType::GetTextHtmlType() { const ClipboardFormatType& ClipboardFormatType::GetTextHtmlType() {
CR_STATIC_UI_CLIPBOARD_FORMAT_TYPE(type, static base::NoDestructor<ClipboardFormatType> format(
::RegisterClipboardFormat(L"text/html")); ::RegisterClipboardFormat(L"text/html"));
return type.Get(); return *format;
} }
// static // static
const ClipboardFormatType& ClipboardFormatType::GetCFHDropType() { const ClipboardFormatType& ClipboardFormatType::GetCFHDropType() {
CR_STATIC_UI_CLIPBOARD_FORMAT_TYPE(type, CF_HDROP); static base::NoDestructor<ClipboardFormatType> format(CF_HDROP);
return type.Get(); return *format;
} }
// Nothing prevents the drag source app from using the CFSTR_FILEDESCRIPTORA // Nothing prevents the drag source app from using the CFSTR_FILEDESCRIPTORA
...@@ -168,16 +162,16 @@ const ClipboardFormatType& ClipboardFormatType::GetCFHDropType() { ...@@ -168,16 +162,16 @@ const ClipboardFormatType& ClipboardFormatType::GetCFHDropType() {
// register both the ANSI and Unicode file group descriptors. // register both the ANSI and Unicode file group descriptors.
// static // static
const ClipboardFormatType& ClipboardFormatType::GetFileDescriptorType() { const ClipboardFormatType& ClipboardFormatType::GetFileDescriptorType() {
CR_STATIC_UI_CLIPBOARD_FORMAT_TYPE( static base::NoDestructor<ClipboardFormatType> format(
type, ::RegisterClipboardFormat(CFSTR_FILEDESCRIPTORA)); ::RegisterClipboardFormat(CFSTR_FILEDESCRIPTORA));
return type.Get(); return *format;
} }
// static // static
const ClipboardFormatType& ClipboardFormatType::GetFileDescriptorWType() { const ClipboardFormatType& ClipboardFormatType::GetFileDescriptorWType() {
CR_STATIC_UI_CLIPBOARD_FORMAT_TYPE( static base::NoDestructor<ClipboardFormatType> format(
type, ::RegisterClipboardFormat(CFSTR_FILEDESCRIPTORW)); ::RegisterClipboardFormat(CFSTR_FILEDESCRIPTORW));
return type.Get(); return *format;
} }
// static // static
...@@ -189,9 +183,9 @@ const ClipboardFormatType& ClipboardFormatType::GetFileContentZeroType() { ...@@ -189,9 +183,9 @@ const ClipboardFormatType& ClipboardFormatType::GetFileContentZeroType() {
// TODO(https://crbug.com/950756): Should TYMED_ISTREAM / TYMED_ISTORAGE be // TODO(https://crbug.com/950756): Should TYMED_ISTREAM / TYMED_ISTORAGE be
// used instead of TYMED_HGLOBAL in // used instead of TYMED_HGLOBAL in
// OSExchangeDataProviderWin::SetFileContents. // OSExchangeDataProviderWin::SetFileContents.
CR_STATIC_UI_CLIPBOARD_FORMAT_TYPE( static base::NoDestructor<ClipboardFormatType> format(
type, ::RegisterClipboardFormat(CFSTR_FILECONTENTS), 0); ::RegisterClipboardFormat(CFSTR_FILECONTENTS));
return type.Get(); return *format;
} }
// static // static
...@@ -216,32 +210,31 @@ const ClipboardFormatType& ClipboardFormatType::GetFileContentAtIndexType( ...@@ -216,32 +210,31 @@ const ClipboardFormatType& ClipboardFormatType::GetFileContentAtIndexType(
// static // static
const ClipboardFormatType& ClipboardFormatType::GetIDListType() { const ClipboardFormatType& ClipboardFormatType::GetIDListType() {
CR_STATIC_UI_CLIPBOARD_FORMAT_TYPE( static base::NoDestructor<ClipboardFormatType> format(
type, ::RegisterClipboardFormat(CFSTR_SHELLIDLIST)); ::RegisterClipboardFormat(CFSTR_SHELLIDLIST));
return type.Get(); return *format;
} }
// static // static
const ClipboardFormatType& ClipboardFormatType::GetWebKitSmartPasteType() { const ClipboardFormatType& ClipboardFormatType::GetWebKitSmartPasteType() {
CR_STATIC_UI_CLIPBOARD_FORMAT_TYPE( static base::NoDestructor<ClipboardFormatType> format(
type, ::RegisterClipboardFormat(L"WebKit Smart Paste Format")); ::RegisterClipboardFormat(L"WebKit Smart Paste Format"));
return type.Get(); return *format;
} }
// static // static
const ClipboardFormatType& ClipboardFormatType::GetWebCustomDataType() { const ClipboardFormatType& ClipboardFormatType::GetWebCustomDataType() {
// TODO(dcheng): This name is temporary. See http://crbug.com/106449. // TODO(http://crbug.com/106449): Standardize this name.
CR_STATIC_UI_CLIPBOARD_FORMAT_TYPE( static base::NoDestructor<ClipboardFormatType> format(
type, ::RegisterClipboardFormat(L"Chromium Web Custom MIME Data Format")); ::RegisterClipboardFormat(L"Chromium Web Custom MIME Data Format"));
return type.Get(); return *format;
} }
// static // static
const ClipboardFormatType& ClipboardFormatType::GetPepperCustomDataType() { const ClipboardFormatType& ClipboardFormatType::GetPepperCustomDataType() {
CR_STATIC_UI_CLIPBOARD_FORMAT_TYPE( static base::NoDestructor<ClipboardFormatType> format(
type, ::RegisterClipboardFormat(L"Chromium Pepper MIME Data Format")); ::RegisterClipboardFormat(L"Chromium Pepper MIME Data Format"));
return type.Get(); return *format;
} }
#undef CR_STATIC_UI_CLIPBOARD_FORMAT_TYPE
} // namespace ui } // namespace ui
...@@ -312,8 +312,8 @@ TEST_F(OSExchangeDataWinTest, TestURLExchangeFormatsViaCOM) { ...@@ -312,8 +312,8 @@ TEST_F(OSExchangeDataWinTest, TestURLExchangeFormatsViaCOM) {
{ {
CLIPFORMAT cfstr_file_contents = CLIPFORMAT cfstr_file_contents =
RegisterClipboardFormat(CFSTR_FILECONTENTS); RegisterClipboardFormat(CFSTR_FILECONTENTS);
FORMATETC format_etc = FORMATETC format_etc = {cfstr_file_contents, nullptr, DVASPECT_CONTENT, -1,
{ cfstr_file_contents, NULL, DVASPECT_CONTENT, 0, TYMED_HGLOBAL }; TYMED_HGLOBAL};
EXPECT_EQ(S_OK, com_data->QueryGetData(&format_etc)); EXPECT_EQ(S_OK, com_data->QueryGetData(&format_etc));
STGMEDIUM medium; STGMEDIUM medium;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment