Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(81)

Unified Diff: ui/base/clipboard/clipboard_win.cc

Issue 658963003: Change Clipboard to use virtual methods for testing purposes. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Address review comments Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « ui/base/clipboard/clipboard_win.h ('k') | ui/base/ui_base.gyp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ui/base/clipboard/clipboard_win.cc
diff --git a/ui/base/clipboard/clipboard_win.cc b/ui/base/clipboard/clipboard_win.cc
index 18a42e2349232e9e51d54ec94120502b4abca195..b269351f1ee5232e40b092cd1a093023af298b10 100644
--- a/ui/base/clipboard/clipboard_win.cc
+++ b/ui/base/clipboard/clipboard_win.cc
@@ -5,7 +5,7 @@
// Many of these functions are based on those found in
// webkit/port/platform/PasteboardWin.cpp
-#include "ui/base/clipboard/clipboard.h"
+#include "ui/base/clipboard/clipboard_win.h"
#include <shellapi.h>
#include <shlobj.h>
@@ -159,6 +159,31 @@ void MakeBitmapOpaque(const SkBitmap& bitmap) {
}
}
+void ParseBookmarkClipboardFormat(const base::string16& bookmark,
+ base::string16* title,
+ std::string* url) {
+ const base::string16 kDelim = base::ASCIIToUTF16("\r\n");
+
+ const size_t title_end = bookmark.find_first_of(kDelim);
+ if (title)
+ title->assign(bookmark.substr(0, title_end));
+
+ if (url) {
+ const size_t url_start = bookmark.find_first_not_of(kDelim, title_end);
+ if (url_start != base::string16::npos) {
+ *url =
+ base::UTF16ToUTF8(bookmark.substr(url_start, base::string16::npos));
+ }
+ }
+}
+
+void FreeData(unsigned int format, HANDLE data) {
+ if (format == CF_BITMAP)
+ ::DeleteObject(static_cast<HBITMAP>(data));
+ else
+ ::GlobalFree(data);
+}
+
} // namespace
// Clipboard::FormatType implementation.
@@ -201,11 +226,11 @@ Clipboard::FormatType Clipboard::FormatType::Deserialize(
}
bool Clipboard::FormatType::operator<(const FormatType& other) const {
- return ToUINT() < other.ToUINT();
+ return data_.cfFormat < other.data_.cfFormat;
}
bool Clipboard::FormatType::Equals(const FormatType& other) const {
- return ToUINT() == other.ToUINT();
+ return data_.cfFormat == other.data_.cfFormat;
}
// Various predefined FormatTypes.
@@ -348,27 +373,33 @@ const Clipboard::FormatType& Clipboard::GetPepperCustomDataFormatType() {
return type;
}
-// Clipboard implementation.
-Clipboard::Clipboard() {
+// Clipboard factory method.
+// static
+Clipboard* Clipboard::Create() {
+ return new ClipboardWin;
+}
+
+// ClipboardWin implementation.
+ClipboardWin::ClipboardWin() {
if (base::MessageLoopForUI::IsCurrent())
clipboard_owner_.reset(new base::win::MessageWindow());
}
-Clipboard::~Clipboard() {
+ClipboardWin::~ClipboardWin() {
}
-uint64 Clipboard::GetSequenceNumber(ClipboardType type) {
+uint64 ClipboardWin::GetSequenceNumber(ClipboardType type) {
DCHECK_EQ(type, CLIPBOARD_TYPE_COPY_PASTE);
return ::GetClipboardSequenceNumber();
}
-bool Clipboard::IsFormatAvailable(const Clipboard::FormatType& format,
- ClipboardType type) const {
+bool ClipboardWin::IsFormatAvailable(const Clipboard::FormatType& format,
+ ClipboardType type) const {
DCHECK_EQ(type, CLIPBOARD_TYPE_COPY_PASTE);
- return ::IsClipboardFormatAvailable(format.ToUINT()) != FALSE;
+ return ::IsClipboardFormatAvailable(format.ToFormatEtc().cfFormat) != FALSE;
}
-void Clipboard::Clear(ClipboardType type) {
+void ClipboardWin::Clear(ClipboardType type) {
DCHECK_EQ(type, CLIPBOARD_TYPE_COPY_PASTE);
ScopedClipboard clipboard;
if (!clipboard.Acquire(GetClipboardWindow()))
@@ -377,20 +408,21 @@ void Clipboard::Clear(ClipboardType type) {
::EmptyClipboard();
}
-void Clipboard::ReadAvailableTypes(ClipboardType type,
- std::vector<base::string16>* types,
- bool* contains_filenames) const {
+void ClipboardWin::ReadAvailableTypes(ClipboardType type,
+ std::vector<base::string16>* types,
+ bool* contains_filenames) const {
if (!types || !contains_filenames) {
NOTREACHED();
return;
}
types->clear();
- if (::IsClipboardFormatAvailable(GetPlainTextFormatType().ToUINT()))
+ if (::IsClipboardFormatAvailable(
+ GetPlainTextFormatType().ToFormatEtc().cfFormat))
types->push_back(base::UTF8ToUTF16(kMimeTypeText));
- if (::IsClipboardFormatAvailable(GetHtmlFormatType().ToUINT()))
+ if (::IsClipboardFormatAvailable(GetHtmlFormatType().ToFormatEtc().cfFormat))
types->push_back(base::UTF8ToUTF16(kMimeTypeHTML));
- if (::IsClipboardFormatAvailable(GetRtfFormatType().ToUINT()))
+ if (::IsClipboardFormatAvailable(GetRtfFormatType().ToFormatEtc().cfFormat))
types->push_back(base::UTF8ToUTF16(kMimeTypeRTF));
if (::IsClipboardFormatAvailable(CF_DIB))
types->push_back(base::UTF8ToUTF16(kMimeTypePNG));
@@ -401,7 +433,8 @@ void Clipboard::ReadAvailableTypes(ClipboardType type,
if (!clipboard.Acquire(GetClipboardWindow()))
return;
- HANDLE hdata = ::GetClipboardData(GetWebCustomDataFormatType().ToUINT());
+ HANDLE hdata =
+ ::GetClipboardData(GetWebCustomDataFormatType().ToFormatEtc().cfFormat);
if (!hdata)
return;
@@ -409,7 +442,7 @@ void Clipboard::ReadAvailableTypes(ClipboardType type,
::GlobalUnlock(hdata);
}
-void Clipboard::ReadText(ClipboardType type, base::string16* result) const {
+void ClipboardWin::ReadText(ClipboardType type, base::string16* result) const {
DCHECK_EQ(type, CLIPBOARD_TYPE_COPY_PASTE);
if (!result) {
NOTREACHED();
@@ -431,7 +464,8 @@ void Clipboard::ReadText(ClipboardType type, base::string16* result) const {
::GlobalUnlock(data);
}
-void Clipboard::ReadAsciiText(ClipboardType type, std::string* result) const {
+void ClipboardWin::ReadAsciiText(ClipboardType type,
+ std::string* result) const {
DCHECK_EQ(type, CLIPBOARD_TYPE_COPY_PASTE);
if (!result) {
NOTREACHED();
@@ -453,11 +487,11 @@ void Clipboard::ReadAsciiText(ClipboardType type, std::string* result) const {
::GlobalUnlock(data);
}
-void Clipboard::ReadHTML(ClipboardType type,
- base::string16* markup,
- std::string* src_url,
- uint32* fragment_start,
- uint32* fragment_end) const {
+void ClipboardWin::ReadHTML(ClipboardType type,
+ base::string16* markup,
+ std::string* src_url,
+ uint32* fragment_start,
+ uint32* fragment_end) const {
DCHECK_EQ(type, CLIPBOARD_TYPE_COPY_PASTE);
markup->clear();
@@ -473,7 +507,7 @@ void Clipboard::ReadHTML(ClipboardType type,
if (!clipboard.Acquire(GetClipboardWindow()))
return;
- HANDLE data = ::GetClipboardData(GetHtmlFormatType().ToUINT());
+ HANDLE data = ::GetClipboardData(GetHtmlFormatType().ToFormatEtc().cfFormat);
if (!data)
return;
@@ -505,13 +539,13 @@ void Clipboard::ReadHTML(ClipboardType type,
*fragment_end = base::checked_cast<uint32>(offsets[1]);
}
-void Clipboard::ReadRTF(ClipboardType type, std::string* result) const {
+void ClipboardWin::ReadRTF(ClipboardType type, std::string* result) const {
DCHECK_EQ(type, CLIPBOARD_TYPE_COPY_PASTE);
ReadData(GetRtfFormatType(), result);
}
-SkBitmap Clipboard::ReadImage(ClipboardType type) const {
+SkBitmap ClipboardWin::ReadImage(ClipboardType type) const {
DCHECK_EQ(type, CLIPBOARD_TYPE_COPY_PASTE);
// Acquire the clipboard.
@@ -581,9 +615,9 @@ SkBitmap Clipboard::ReadImage(ClipboardType type) const {
return canvas.ExtractImageRep().sk_bitmap();
}
-void Clipboard::ReadCustomData(ClipboardType clipboard_type,
- const base::string16& type,
- base::string16* result) const {
+void ClipboardWin::ReadCustomData(ClipboardType clipboard_type,
+ const base::string16& type,
+ base::string16* result) const {
DCHECK_EQ(clipboard_type, CLIPBOARD_TYPE_COPY_PASTE);
// Acquire the clipboard.
@@ -591,7 +625,8 @@ void Clipboard::ReadCustomData(ClipboardType clipboard_type,
if (!clipboard.Acquire(GetClipboardWindow()))
return;
- HANDLE hdata = ::GetClipboardData(GetWebCustomDataFormatType().ToUINT());
+ HANDLE hdata =
+ ::GetClipboardData(GetWebCustomDataFormatType().ToFormatEtc().cfFormat);
if (!hdata)
return;
@@ -599,7 +634,7 @@ void Clipboard::ReadCustomData(ClipboardType clipboard_type,
::GlobalUnlock(hdata);
}
-void Clipboard::ReadBookmark(base::string16* title, std::string* url) const {
+void ClipboardWin::ReadBookmark(base::string16* title, std::string* url) const {
if (title)
title->clear();
@@ -611,7 +646,7 @@ void Clipboard::ReadBookmark(base::string16* title, std::string* url) const {
if (!clipboard.Acquire(GetClipboardWindow()))
return;
- HANDLE data = ::GetClipboardData(GetUrlWFormatType().ToUINT());
+ HANDLE data = ::GetClipboardData(GetUrlWFormatType().ToFormatEtc().cfFormat);
if (!data)
return;
@@ -621,7 +656,8 @@ void Clipboard::ReadBookmark(base::string16* title, std::string* url) const {
ParseBookmarkClipboardFormat(bookmark, title, url);
}
-void Clipboard::ReadData(const FormatType& format, std::string* result) const {
+void ClipboardWin::ReadData(const FormatType& format,
+ std::string* result) const {
if (!result) {
NOTREACHED();
return;
@@ -631,7 +667,7 @@ void Clipboard::ReadData(const FormatType& format, std::string* result) const {
if (!clipboard.Acquire(GetClipboardWindow()))
return;
- HANDLE data = ::GetClipboardData(format.ToUINT());
+ HANDLE data = ::GetClipboardData(format.ToFormatEtc().cfFormat);
if (!data)
return;
@@ -640,26 +676,7 @@ void Clipboard::ReadData(const FormatType& format, std::string* result) const {
::GlobalUnlock(data);
}
-// static
-void Clipboard::ParseBookmarkClipboardFormat(const base::string16& bookmark,
- base::string16* title,
- std::string* url) {
- const base::string16 kDelim = base::ASCIIToUTF16("\r\n");
-
- const size_t title_end = bookmark.find_first_of(kDelim);
- if (title)
- title->assign(bookmark.substr(0, title_end));
-
- if (url) {
- const size_t url_start = bookmark.find_first_not_of(kDelim, title_end);
- if (url_start != base::string16::npos) {
- *url = base::UTF16ToUTF8(
- bookmark.substr(url_start, base::string16::npos));
- }
- }
-}
-
-void Clipboard::WriteObjects(ClipboardType type, const ObjectMap& objects) {
+void ClipboardWin::WriteObjects(ClipboardType type, const ObjectMap& objects) {
DCHECK_EQ(type, CLIPBOARD_TYPE_COPY_PASTE);
ScopedClipboard clipboard;
@@ -668,13 +685,13 @@ void Clipboard::WriteObjects(ClipboardType type, const ObjectMap& objects) {
::EmptyClipboard();
- for (ObjectMap::const_iterator iter = objects.begin();
- iter != objects.end(); ++iter) {
+ for (ObjectMap::const_iterator iter = objects.begin(); iter != objects.end();
+ ++iter) {
DispatchObject(static_cast<ObjectType>(iter->first), iter->second);
}
}
-void Clipboard::WriteText(const char* text_data, size_t text_len) {
+void ClipboardWin::WriteText(const char* text_data, size_t text_len) {
base::string16 text;
base::UTF8ToUTF16(text_data, text_len, &text);
HGLOBAL glob = CreateGlobalData(text);
@@ -682,10 +699,10 @@ void Clipboard::WriteText(const char* text_data, size_t text_len) {
WriteToClipboard(CF_UNICODETEXT, glob);
}
-void Clipboard::WriteHTML(const char* markup_data,
- size_t markup_len,
- const char* url_data,
- size_t url_len) {
+void ClipboardWin::WriteHTML(const char* markup_data,
+ size_t markup_len,
+ const char* url_data,
+ size_t url_len) {
std::string markup(markup_data, markup_len);
std::string url;
@@ -695,17 +712,17 @@ void Clipboard::WriteHTML(const char* markup_data,
std::string html_fragment = ClipboardUtil::HtmlToCFHtml(markup, url);
HGLOBAL glob = CreateGlobalData(html_fragment);
- WriteToClipboard(Clipboard::GetHtmlFormatType().ToUINT(), glob);
+ WriteToClipboard(Clipboard::GetHtmlFormatType().ToFormatEtc().cfFormat, glob);
}
-void Clipboard::WriteRTF(const char* rtf_data, size_t data_len) {
+void ClipboardWin::WriteRTF(const char* rtf_data, size_t data_len) {
WriteData(GetRtfFormatType(), rtf_data, data_len);
}
-void Clipboard::WriteBookmark(const char* title_data,
- size_t title_len,
- const char* url_data,
- size_t url_len) {
+void ClipboardWin::WriteBookmark(const char* title_data,
+ size_t title_len,
+ const char* url_data,
+ size_t url_len) {
std::string bookmark(title_data, title_len);
bookmark.append(1, L'\n');
bookmark.append(url_data, url_len);
@@ -713,15 +730,16 @@ void Clipboard::WriteBookmark(const char* title_data,
base::string16 wide_bookmark = base::UTF8ToWide(bookmark);
HGLOBAL glob = CreateGlobalData(wide_bookmark);
- WriteToClipboard(GetUrlWFormatType().ToUINT(), glob);
+ WriteToClipboard(GetUrlWFormatType().ToFormatEtc().cfFormat, glob);
}
-void Clipboard::WriteWebSmartPaste() {
+void ClipboardWin::WriteWebSmartPaste() {
DCHECK(clipboard_owner_->hwnd() != NULL);
- ::SetClipboardData(GetWebKitSmartPasteFormatType().ToUINT(), NULL);
+ ::SetClipboardData(GetWebKitSmartPasteFormatType().ToFormatEtc().cfFormat,
+ NULL);
}
-void Clipboard::WriteBitmap(const SkBitmap& bitmap) {
+void ClipboardWin::WriteBitmap(const SkBitmap& bitmap) {
HDC dc = ::GetDC(NULL);
// This doesn't actually cost us a memcpy when the bitmap comes from the
@@ -740,7 +758,7 @@ void Clipboard::WriteBitmap(const SkBitmap& bitmap) {
// ::CreateDIBSection allocates memory for us to copy our bitmap into.
// Unfortunately, we can't write the created bitmap to the clipboard,
// (see http://msdn2.microsoft.com/en-us/library/ms532292.aspx)
- void *bits;
+ void* bits;
HBITMAP source_hbitmap =
::CreateDIBSection(dc, &bm_info, DIB_RGB_COLORS, &bits, NULL, 0);
@@ -760,8 +778,21 @@ void Clipboard::WriteBitmap(const SkBitmap& bitmap) {
::ReleaseDC(NULL, dc);
}
-void Clipboard::WriteBitmapFromHandle(HBITMAP source_hbitmap,
- const gfx::Size& size) {
+void ClipboardWin::WriteData(const FormatType& format,
+ const char* data_data,
+ size_t data_len) {
+ HGLOBAL hdata = ::GlobalAlloc(GMEM_MOVEABLE, data_len);
+ if (!hdata)
+ return;
+
+ char* data = static_cast<char*>(::GlobalLock(hdata));
+ memcpy(data, data_data, data_len);
+ ::GlobalUnlock(data);
+ WriteToClipboard(format.ToFormatEtc().cfFormat, hdata);
+}
+
+void ClipboardWin::WriteBitmapFromHandle(HBITMAP source_hbitmap,
+ const gfx::Size& size) {
// We would like to just call ::SetClipboardData on the source_hbitmap,
// but that bitmap might not be of a sort we can write to the clipboard.
// For this reason, we create a new bitmap, copy the bits over, and then
@@ -786,8 +817,17 @@ void Clipboard::WriteBitmapFromHandle(HBITMAP source_hbitmap,
// Now we need to blend it into an HBITMAP we can place on the clipboard
BLENDFUNCTION bf = {AC_SRC_OVER, 0, 255, AC_SRC_ALPHA};
- ::GdiAlphaBlend(compatible_dc, 0, 0, size.width(), size.height(),
- source_dc, 0, 0, size.width(), size.height(), bf);
+ ::GdiAlphaBlend(compatible_dc,
+ 0,
+ 0,
+ size.width(),
+ size.height(),
+ source_dc,
+ 0,
+ 0,
+ size.width(),
+ size.height(),
+ bf);
// Clean up all the handles we just opened
::SelectObject(compatible_dc, old_hbitmap);
@@ -801,20 +841,7 @@ void Clipboard::WriteBitmapFromHandle(HBITMAP source_hbitmap,
WriteToClipboard(CF_BITMAP, hbitmap);
}
-void Clipboard::WriteData(const FormatType& format,
- const char* data_data,
- size_t data_len) {
- HGLOBAL hdata = ::GlobalAlloc(GMEM_MOVEABLE, data_len);
- if (!hdata)
- return;
-
- char* data = static_cast<char*>(::GlobalLock(hdata));
- memcpy(data, data_data, data_len);
- ::GlobalUnlock(data);
- WriteToClipboard(format.ToUINT(), hdata);
-}
-
-void Clipboard::WriteToClipboard(unsigned int format, HANDLE handle) {
+void ClipboardWin::WriteToClipboard(unsigned int format, HANDLE handle) {
DCHECK(clipboard_owner_->hwnd() != NULL);
if (handle && !::SetClipboardData(format, handle)) {
DCHECK(ERROR_CLIPBOARD_NOT_OPEN != GetLastError());
@@ -822,15 +849,7 @@ void Clipboard::WriteToClipboard(unsigned int format, HANDLE handle) {
}
}
-// static
-void Clipboard::FreeData(unsigned int format, HANDLE data) {
- if (format == CF_BITMAP)
- ::DeleteObject(static_cast<HBITMAP>(data));
- else
- ::GlobalFree(data);
-}
-
-HWND Clipboard::GetClipboardWindow() const {
+HWND ClipboardWin::GetClipboardWindow() const {
if (!clipboard_owner_)
return NULL;
« no previous file with comments | « ui/base/clipboard/clipboard_win.h ('k') | ui/base/ui_base.gyp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698