summaryrefslogtreecommitdiffstats
path: root/ui/base
diff options
context:
space:
mode:
authorraymes@chromium.org <raymes@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-04-02 17:45:24 +0000
committerraymes@chromium.org <raymes@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-04-02 17:45:24 +0000
commit79aedba70423341c301010f226bf81661d01739a (patch)
tree2e3e734fc9d1351aea893a87d22a261669259c49 /ui/base
parentec00443bc59ffdcd2eb43a02ddd1ebbf666bde9a (diff)
downloadchromium_src-79aedba70423341c301010f226bf81661d01739a.zip
chromium_src-79aedba70423341c301010f226bf81661d01739a.tar.gz
chromium_src-79aedba70423341c301010f226bf81661d01739a.tar.bz2
Added RTF support to the clipboard.
This is needed for pepper flash. The pepper integration will come as a separate CL. BUG=120435 TEST=out/Debug/ui_unittests --gtest_filter=*Clipboard* Review URL: http://codereview.chromium.org/9860040 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@130161 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'ui/base')
-rw-r--r--ui/base/clipboard/clipboard.cc5
-rw-r--r--ui/base/clipboard/clipboard.h10
-rw-r--r--ui/base/clipboard/clipboard_android.cc13
-rw-r--r--ui/base/clipboard/clipboard_aurax11.cc86
-rw-r--r--ui/base/clipboard/clipboard_gtk.cc17
-rw-r--r--ui/base/clipboard/clipboard_mac.mm19
-rw-r--r--ui/base/clipboard/clipboard_unittest.cc21
-rw-r--r--ui/base/clipboard/clipboard_util_win.cc6
-rw-r--r--ui/base/clipboard/clipboard_util_win.h2
-rw-r--r--ui/base/clipboard/clipboard_win.cc31
-rw-r--r--ui/base/clipboard/scoped_clipboard_writer.cc10
-rw-r--r--ui/base/clipboard/scoped_clipboard_writer.h3
12 files changed, 194 insertions, 29 deletions
diff --git a/ui/base/clipboard/clipboard.cc b/ui/base/clipboard/clipboard.cc
index ffd35d8..d20d854 100644
--- a/ui/base/clipboard/clipboard.cc
+++ b/ui/base/clipboard/clipboard.cc
@@ -78,6 +78,7 @@ const char Clipboard::kMimeTypeText[] = "text/plain";
const char Clipboard::kMimeTypeURIList[] = "text/uri-list";
const char Clipboard::kMimeTypeDownloadURL[] = "downloadurl";
const char Clipboard::kMimeTypeHTML[] = "text/html";
+const char Clipboard::kMimeTypeRTF[] = "text/rtf";
const char Clipboard::kMimeTypePNG[] = "image/png";
void Clipboard::DispatchObject(ObjectType type, const ObjectMapParams& params) {
@@ -105,6 +106,10 @@ void Clipboard::DispatchObject(ObjectType type, const ObjectMapParams& params) {
}
break;
+ case CBF_RTF:
+ WriteRTF(&(params[0].front()), params[0].size());
+ break;
+
case CBF_BOOKMARK:
WriteBookmark(&(params[0].front()), params[0].size(),
&(params[1].front()), params[1].size());
diff --git a/ui/base/clipboard/clipboard.h b/ui/base/clipboard/clipboard.h
index a268512..8abafac 100644
--- a/ui/base/clipboard/clipboard.h
+++ b/ui/base/clipboard/clipboard.h
@@ -55,6 +55,7 @@ class UI_EXPORT Clipboard : NON_EXPORTED_BASE(public base::ThreadChecker) {
static const char kMimeTypeURIList[];
static const char kMimeTypeDownloadURL[];
static const char kMimeTypeHTML[];
+ static const char kMimeTypeRTF[];
static const char kMimeTypePNG[];
// Platform neutral holder for native data representation of a clipboard type.
@@ -117,6 +118,7 @@ class UI_EXPORT Clipboard : NON_EXPORTED_BASE(public base::ThreadChecker) {
enum ObjectType {
CBF_TEXT,
CBF_HTML,
+ CBF_RTF,
CBF_BOOKMARK,
CBF_FILES,
CBF_WEBKIT,
@@ -135,6 +137,7 @@ class UI_EXPORT Clipboard : NON_EXPORTED_BASE(public base::ThreadChecker) {
// CBF_TEXT text char array
// CBF_HTML html char array
// url* char array
+ // CBF_RTF data byte array
// CBF_BOOKMARK html char array
// url char array
// CBF_LINK html char array
@@ -225,6 +228,10 @@ class UI_EXPORT Clipboard : NON_EXPORTED_BASE(public base::ThreadChecker) {
void ReadHTML(Buffer buffer, string16* markup, std::string* src_url,
uint32* fragment_start, uint32* fragment_end) const;
+ // Reads RTF from the clipboard, if available. Stores the result as a byte
+ // vector.
+ void ReadRTF(Buffer buffer, std::string* result) const;
+
// Reads an image from the clipboard, if available.
SkBitmap ReadImage(Buffer buffer) const;
@@ -255,6 +262,7 @@ class UI_EXPORT Clipboard : NON_EXPORTED_BASE(public base::ThreadChecker) {
static const FormatType& GetWebKitSmartPasteFormatType();
// Win: MS HTML Format, Other: Generic HTML format
static const FormatType& GetHtmlFormatType();
+ static const FormatType& GetRtfFormatType();
static const FormatType& GetBitmapFormatType();
static const FormatType& GetWebCustomDataFormatType();
@@ -287,6 +295,8 @@ class UI_EXPORT Clipboard : NON_EXPORTED_BASE(public base::ThreadChecker) {
const char* url_data,
size_t url_len);
+ void WriteRTF(const char* rtf_data, size_t data_len);
+
void WriteBookmark(const char* title_data,
size_t title_len,
const char* url_data,
diff --git a/ui/base/clipboard/clipboard_android.cc b/ui/base/clipboard/clipboard_android.cc
index bf54202..1a7d6ba 100644
--- a/ui/base/clipboard/clipboard_android.cc
+++ b/ui/base/clipboard/clipboard_android.cc
@@ -14,6 +14,7 @@ namespace {
// Various format we support.
const char kPlainTextFormat[] = "text";
const char kHTMLFormat[] = "html";
+const char kRTFFormat[] = "rtf";
const char kBitmapFormat[] = "bitmap";
const char kWebKitSmartPasteFormat[] = "webkit_smart";
const char kBookmarkFormat[] = "bookmark";
@@ -85,6 +86,9 @@ void Clipboard::ReadHTML(Clipboard::Buffer buffer,
uint32* fragment_end) const {
}
+void Clipboard::ReadRTF(Buffer buffer, std::string* result) const {
+}
+
SkBitmap Clipboard::ReadImage(Buffer buffer) const {
return SkBitmap();
}
@@ -132,6 +136,12 @@ const Clipboard::FormatType& Clipboard::GetHtmlFormatType() {
}
// static
+const Clipboard::FormatType& Clipboard::GetRtfFormatType() {
+ CR_DEFINE_STATIC_LOCAL(FormatType, type, (kRTFFormat));
+ return type;
+}
+
+// static
const Clipboard::FormatType& Clipboard::GetBitmapFormatType() {
CR_DEFINE_STATIC_LOCAL(FormatType, type, (kBitmapFormat));
return type;
@@ -152,6 +162,9 @@ void Clipboard::WriteHTML(const char* markup_data,
size_t url_len) {
}
+void Clipboard::WriteRTF(const char* rtf_data, size_t data_len) {
+}
+
void Clipboard::WriteBookmark(const char* title_data, size_t title_len,
const char* url_data, size_t url_len) {
}
diff --git a/ui/base/clipboard/clipboard_aurax11.cc b/ui/base/clipboard/clipboard_aurax11.cc
index e6c4a80..da94c0d 100644
--- a/ui/base/clipboard/clipboard_aurax11.cc
+++ b/ui/base/clipboard/clipboard_aurax11.cc
@@ -28,10 +28,11 @@ const size_t kMaxClipboardSize = 1;
enum AuraClipboardFormat {
TEXT = 1 << 0,
HTML = 1 << 1,
- BOOKMARK = 1 << 2,
- BITMAP = 1 << 3,
- CUSTOM = 1 << 4,
- WEB = 1 << 5,
+ RTF = 1 << 2,
+ BOOKMARK = 1 << 3,
+ BITMAP = 1 << 4,
+ CUSTOM = 1 << 5,
+ WEB = 1 << 6,
};
// ClipboardData contains data copied to the Clipboard for a variety of formats.
@@ -40,8 +41,6 @@ class ClipboardData {
public:
ClipboardData()
: bitmap_data_(),
- custom_data_data_(),
- custom_data_len_(0),
web_smart_paste_(false),
format_(0) {}
@@ -62,6 +61,12 @@ class ClipboardData {
format_ |= HTML;
}
+ const std::string& rtf_data() const { return rtf_data_; }
+ void SetRTFData(const std::string& rtf_data) {
+ rtf_data_ = rtf_data;
+ format_ |= RTF;
+ }
+
const std::string& url() const { return url_; }
void set_url(const std::string& url) {
url_ = url;
@@ -93,20 +98,15 @@ class ClipboardData {
}
const std::string& custom_data_format() const { return custom_data_format_; }
- char* custom_data_data() const { return custom_data_data_.get(); }
- size_t custom_data_len() const { return custom_data_len_; }
-
+ const std::string& custom_data_data() const { return custom_data_data_; }
void SetCustomData(const std::string& data_format,
- const char* data_data,
- size_t data_len) {
- custom_data_len_ = data_len;
- if (custom_data_len_ == 0) {
- custom_data_data_.reset();
+ const std::string& data_data) {
+ if (data_data.size() == 0) {
+ custom_data_data_.clear();
custom_data_format_.clear();
return;
}
- custom_data_data_.reset(new char[custom_data_len_]);
- memcpy(custom_data_data_.get(), data_data, custom_data_len_);
+ custom_data_data_ = data_data;
custom_data_format_ = data_format;
format_ |= CUSTOM;
}
@@ -125,6 +125,9 @@ class ClipboardData {
std::string markup_data_;
std::string url_;
+ // RTF data.
+ std::string rtf_data_;
+
// Bookmark title in UTF8 format.
std::string bookmark_title_;
std::string bookmark_url_;
@@ -138,8 +141,7 @@ class ClipboardData {
// Data with custom format.
std::string custom_data_format_;
- scoped_array<char> custom_data_data_;
- size_t custom_data_len_;
+ std::string custom_data_data_;
// WebKit smart paste data.
bool web_smart_paste_;
@@ -234,6 +236,16 @@ class AuraClipboard {
*fragment_end = static_cast<uint32>(markup->length());
}
+ // Reads RTF from the data at the top of clipboard stack.
+ void ReadRTF(std::string* result) const {
+ result->clear();
+ const ClipboardData* data = GetData();
+ if (!HasFormat(RTF))
+ return;
+
+ *result = data->rtf_data();
+ }
+
// Reads image from the data at the top of clipboard stack.
SkBitmap ReadImage() const {
SkBitmap img;
@@ -257,7 +269,8 @@ class AuraClipboard {
if (!HasFormat(CUSTOM))
return;
- ui::ReadCustomDataForType(data->custom_data_data(), data->custom_data_len(),
+ ui::ReadCustomDataForType(data->custom_data_data().c_str(),
+ data->custom_data_data().size(),
type, result);
}
@@ -276,11 +289,10 @@ class AuraClipboard {
void ReadData(const std::string& type, std::string* result) const {
result->clear();
const ClipboardData* data = GetData();
- if (!HasFormat(CUSTOM) ||
- type != data->custom_data_format())
+ if (!HasFormat(CUSTOM) || type != data->custom_data_format())
return;
- *result = std::string(data->custom_data_data(), data->custom_data_len());
+ *result = data->custom_data_data();
}
// Writes |data| to the top of the clipboard stack.
@@ -355,6 +367,11 @@ class ClipboardDataBuilder {
data->set_url(std::string(url_data, url_len));
}
+ static void WriteRTF(const char* rtf_data, size_t rtf_len) {
+ ClipboardData* data = GetCurrentData();
+ data->SetRTFData(std::string(rtf_data, rtf_len));
+ }
+
static void WriteBookmark(const char* title_data,
size_t title_len,
const char* url_data,
@@ -378,7 +395,7 @@ class ClipboardDataBuilder {
const char* data_data,
size_t data_len) {
ClipboardData* data = GetCurrentData();
- data->SetCustomData(format, data_data, data_len);
+ data->SetCustomData(format, std::string(data_data, data_len));
}
private:
@@ -449,6 +466,8 @@ bool Clipboard::IsFormatAvailable(const FormatType& format,
return clipboard->IsFormatAvailable(TEXT);
else if (GetHtmlFormatType().Equals(format))
return clipboard->IsFormatAvailable(HTML);
+ else if (GetRtfFormatType().Equals(format))
+ return clipboard->IsFormatAvailable(RTF);
else if (GetBitmapFormatType().Equals(format))
return clipboard->IsFormatAvailable(BITMAP);
else if (GetWebKitSmartPasteFormatType().Equals(format))
@@ -482,13 +501,15 @@ void Clipboard::ReadAvailableTypes(Buffer buffer, std::vector<string16>* types,
types->push_back(UTF8ToUTF16(GetPlainTextFormatType().ToString()));
if (IsFormatAvailable(GetHtmlFormatType(), buffer))
types->push_back(UTF8ToUTF16(GetHtmlFormatType().ToString()));
+ if (IsFormatAvailable(GetRtfFormatType(), buffer))
+ types->push_back(UTF8ToUTF16(GetRtfFormatType().ToString()));
if (IsFormatAvailable(GetBitmapFormatType(), buffer))
types->push_back(UTF8ToUTF16(GetBitmapFormatType().ToString()));
AuraClipboard* clipboard = GetClipboard();
if (clipboard->IsFormatAvailable(CUSTOM) && clipboard->GetData()) {
- ui::ReadCustomDataTypes(clipboard->GetData()->custom_data_data(),
- clipboard->GetData()->custom_data_len(), types);
+ ui::ReadCustomDataTypes(clipboard->GetData()->custom_data_data().c_str(),
+ clipboard->GetData()->custom_data_data().size(), types);
}
}
@@ -511,6 +532,11 @@ void Clipboard::ReadHTML(Buffer buffer,
GetClipboard()->ReadHTML(markup, src_url, fragment_start, fragment_end);
}
+void Clipboard::ReadRTF(Buffer buffer, std::string* result) const {
+ DCHECK(CalledOnValidThread());
+ GetClipboard()->ReadRTF(result);
+}
+
SkBitmap Clipboard::ReadImage(Buffer buffer) const {
DCHECK(CalledOnValidThread());
return GetClipboard()->ReadImage();
@@ -549,6 +575,10 @@ void Clipboard::WriteHTML(const char* markup_data,
ClipboardDataBuilder::WriteHTML(markup_data, markup_len, url_data, url_len);
}
+void Clipboard::WriteRTF(const char* rtf_data, size_t data_len) {
+ ClipboardDataBuilder::WriteRTF(rtf_data, data_len);
+}
+
void Clipboard::WriteBookmark(const char* title_data,
size_t title_len,
const char* url_data,
@@ -605,6 +635,12 @@ const Clipboard::FormatType& Clipboard::GetHtmlFormatType() {
}
// static
+const Clipboard::FormatType& Clipboard::GetRtfFormatType() {
+ CR_DEFINE_STATIC_LOCAL(FormatType, type, (kMimeTypeRTF));
+ return type;
+}
+
+// static
const Clipboard::FormatType& Clipboard::GetBitmapFormatType() {
CR_DEFINE_STATIC_LOCAL(FormatType, type, (kMimeTypeBitmap));
return type;
diff --git a/ui/base/clipboard/clipboard_gtk.cc b/ui/base/clipboard/clipboard_gtk.cc
index f069c8c..b1d7880 100644
--- a/ui/base/clipboard/clipboard_gtk.cc
+++ b/ui/base/clipboard/clipboard_gtk.cc
@@ -322,6 +322,10 @@ void Clipboard::WriteHTML(const char* markup_data,
InsertMapping(kMimeTypeHTML, data, total_len);
}
+void Clipboard::WriteRTF(const char* rtf_data, size_t data_len) {
+ WriteData(GetRtfFormatType(), rtf_data, data_len);
+}
+
// Write an extra flavor that signifies WebKit was the last to modify the
// pasteboard. This flavor has no data.
void Clipboard::WriteWebSmartPaste() {
@@ -447,6 +451,8 @@ void Clipboard::ReadAvailableTypes(Clipboard::Buffer buffer,
types->push_back(UTF8ToUTF16(kMimeTypeText));
if (IsFormatAvailable(GetHtmlFormatType(), buffer))
types->push_back(UTF8ToUTF16(kMimeTypeHTML));
+ if (IsFormatAvailable(GetRtfFormatType(), buffer))
+ types->push_back(UTF8ToUTF16(kMimeTypeRTF));
if (IsFormatAvailable(GetBitmapFormatType(), buffer))
types->push_back(UTF8ToUTF16(kMimeTypePNG));
*contains_filenames = false;
@@ -545,6 +551,11 @@ void Clipboard::ReadHTML(Clipboard::Buffer buffer, string16* markup,
gtk_selection_data_free(data);
}
+void Clipboard::ReadRTF(Buffer buffer, std::string* result) const {
+ DCHECK(CalledOnValidThread());
+ ReadData(GetRtfFormatType(), result);
+}
+
SkBitmap Clipboard::ReadImage(Buffer buffer) const {
DCHECK(CalledOnValidThread());
ScopedGObject<GdkPixbuf>::Type pixbuf(
@@ -631,6 +642,12 @@ const Clipboard::FormatType& Clipboard::GetHtmlFormatType() {
}
// static
+const Clipboard::FormatType& Clipboard::GetRtfFormatType() {
+ CR_DEFINE_STATIC_LOCAL(FormatType, type, (kMimeTypeRTF));
+ return type;
+}
+
+// static
const Clipboard::FormatType& Clipboard::GetBitmapFormatType() {
CR_DEFINE_STATIC_LOCAL(FormatType, type, (kMimeTypeBitmap));
return type;
diff --git a/ui/base/clipboard/clipboard_mac.mm b/ui/base/clipboard/clipboard_mac.mm
index 622a728..7d0bea1 100644
--- a/ui/base/clipboard/clipboard_mac.mm
+++ b/ui/base/clipboard/clipboard_mac.mm
@@ -122,6 +122,10 @@ void Clipboard::WriteHTML(const char* markup_data,
[pb setString:html_fragment forType:NSHTMLPboardType];
}
+void Clipboard::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,
@@ -255,6 +259,8 @@ void Clipboard::ReadAvailableTypes(Clipboard::Buffer buffer,
types->push_back(UTF8ToUTF16(kMimeTypeText));
if (IsFormatAvailable(Clipboard::GetHtmlFormatType(), buffer))
types->push_back(UTF8ToUTF16(kMimeTypeHTML));
+ if (IsFormatAvailable(Clipboard::GetRtfFormatType(), buffer))
+ types->push_back(UTF8ToUTF16(kMimeTypeRTF));
if ([NSImage canInitWithPasteboard:GetPasteboard()])
types->push_back(UTF8ToUTF16(kMimeTypePNG));
*contains_filenames = false;
@@ -322,6 +328,13 @@ void Clipboard::ReadHTML(Clipboard::Buffer buffer, string16* markup,
*fragment_end = static_cast<uint32>(markup->length());
}
+void Clipboard::ReadRTF(Buffer buffer, std::string* result) const {
+ DCHECK(CalledOnValidThread());
+ DCHECK_EQ(buffer, BUFFER_STANDARD);
+
+ return ReadData(GetRtfFormatType(), result);
+}
+
SkBitmap Clipboard::ReadImage(Buffer buffer) const {
DCHECK(CalledOnValidThread());
DCHECK_EQ(buffer, BUFFER_STANDARD);
@@ -439,6 +452,12 @@ const Clipboard::FormatType& Clipboard::GetHtmlFormatType() {
}
// static
+const Clipboard::FormatType& Clipboard::GetRtfFormatType() {
+ CR_DEFINE_STATIC_LOCAL(FormatType, type, (NSRTFPboardType));
+ return type;
+}
+
+// static
const Clipboard::FormatType& Clipboard::GetBitmapFormatType() {
CR_DEFINE_STATIC_LOCAL(FormatType, type, (NSTIFFPboardType));
return type;
diff --git a/ui/base/clipboard/clipboard_unittest.cc b/ui/base/clipboard/clipboard_unittest.cc
index c586d51..697e1db 100644
--- a/ui/base/clipboard/clipboard_unittest.cc
+++ b/ui/base/clipboard/clipboard_unittest.cc
@@ -115,6 +115,27 @@ TEST_F(ClipboardTest, HTMLTest) {
#endif // defined(OS_WIN)
}
+TEST_F(ClipboardTest, RTFTest) {
+ Clipboard clipboard;
+
+ std::string rtf =
+ "{\\rtf1\\ansi{\\fonttbl\\f0\\fswiss Helvetica;}\\f0\\pard\n"
+ "This is some {\\b bold} text.\\par\n"
+ "}";
+
+ {
+ ScopedClipboardWriter clipboard_writer(&clipboard,
+ Clipboard::BUFFER_STANDARD);
+ clipboard_writer.WriteRTF(rtf);
+ }
+
+ EXPECT_TRUE(clipboard.IsFormatAvailable(Clipboard::GetRtfFormatType(),
+ Clipboard::BUFFER_STANDARD));
+ std::string result;
+ clipboard.ReadRTF(Clipboard::BUFFER_STANDARD, &result);
+ EXPECT_EQ(rtf, result);
+}
+
#if defined(TOOLKIT_USES_GTK)
TEST_F(ClipboardTest, MultipleBufferTest) {
Clipboard clipboard;
diff --git a/ui/base/clipboard/clipboard_util_win.cc b/ui/base/clipboard/clipboard_util_win.cc
index c8281b4..bb9e271 100644
--- a/ui/base/clipboard/clipboard_util_win.cc
+++ b/ui/base/clipboard/clipboard_util_win.cc
@@ -173,6 +173,12 @@ FORMATETC* ClipboardUtil::GetHtmlFormat() {
return &format;
}
+FORMATETC* ClipboardUtil::GetRtfFormat() {
+ static UINT cf = RegisterClipboardFormat(L"Rich Text Format");
+ static FORMATETC format = {cf, 0, DVASPECT_CONTENT, -1, TYMED_HGLOBAL};
+ return &format;
+}
+
FORMATETC* ClipboardUtil::GetTextHtmlFormat() {
static UINT cf = RegisterClipboardFormat(L"text/html");
static FORMATETC format = {cf, 0, DVASPECT_CONTENT, -1, TYMED_HGLOBAL};
diff --git a/ui/base/clipboard/clipboard_util_win.h b/ui/base/clipboard/clipboard_util_win.h
index ec0be35..87e503a 100644
--- a/ui/base/clipboard/clipboard_util_win.h
+++ b/ui/base/clipboard/clipboard_util_win.h
@@ -31,6 +31,8 @@ class UI_EXPORT ClipboardUtil {
static FORMATETC* GetFilenameWFormat();
// MS HTML Format
static FORMATETC* GetHtmlFormat();
+ // MS RTF Format
+ static FORMATETC* GetRtfFormat();
// Firefox text/html
static FORMATETC* GetTextHtmlFormat();
static FORMATETC* GetCFHDropFormat();
diff --git a/ui/base/clipboard/clipboard_win.cc b/ui/base/clipboard/clipboard_win.cc
index bd21708..8b2eaea 100644
--- a/ui/base/clipboard/clipboard_win.cc
+++ b/ui/base/clipboard/clipboard_win.cc
@@ -245,6 +245,10 @@ void Clipboard::WriteHTML(const char* markup_data,
WriteToClipboard(ClipboardUtil::GetHtmlFormat()->cfFormat, glob);
}
+void Clipboard::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,
@@ -391,13 +395,16 @@ void Clipboard::ReadAvailableTypes(Clipboard::Buffer buffer,
return;
}
- const FORMATETC* textFormat = ClipboardUtil::GetPlainTextFormat();
- const FORMATETC* htmlFormat = ClipboardUtil::GetHtmlFormat();
+ const FORMATETC* text_format = ClipboardUtil::GetPlainTextFormat();
+ const FORMATETC* html_format = ClipboardUtil::GetHtmlFormat();
+ const FORMATETC* rtf_format = ClipboardUtil::GetRtfFormat();
types->clear();
- if (::IsClipboardFormatAvailable(textFormat->cfFormat))
+ if (::IsClipboardFormatAvailable(text_format->cfFormat))
types->push_back(UTF8ToUTF16(kMimeTypeText));
- if (::IsClipboardFormatAvailable(htmlFormat->cfFormat))
+ if (::IsClipboardFormatAvailable(html_format->cfFormat))
types->push_back(UTF8ToUTF16(kMimeTypeHTML));
+ if (::IsClipboardFormatAvailable(rtf_format->cfFormat))
+ types->push_back(UTF8ToUTF16(kMimeTypeRTF));
if (::IsClipboardFormatAvailable(CF_DIB))
types->push_back(UTF8ToUTF16(kMimeTypePNG));
*contains_filenames = false;
@@ -513,6 +520,12 @@ void Clipboard::ReadHTML(Clipboard::Buffer buffer, string16* markup,
*fragment_end = static_cast<uint32>(offsets[1]);
}
+void Clipboard::ReadRTF(Buffer buffer, std::string* result) const {
+ DCHECK_EQ(buffer, BUFFER_STANDARD);
+
+ ReadData(GetRtfFormatType(), result);
+}
+
SkBitmap Clipboard::ReadImage(Buffer buffer) const {
DCHECK_EQ(buffer, BUFFER_STANDARD);
@@ -739,6 +752,16 @@ const Clipboard::FormatType& Clipboard::GetHtmlFormatType() {
return type;
}
+// MS RTF Format
+// static
+const Clipboard::FormatType& Clipboard::GetRtfFormatType() {
+ CR_DEFINE_STATIC_LOCAL(
+ FormatType,
+ type,
+ (ClipboardUtil::GetRtfFormat()->cfFormat));
+ return type;
+}
+
// static
const Clipboard::FormatType& Clipboard::GetBitmapFormatType() {
CR_DEFINE_STATIC_LOCAL(FormatType, type, (CF_BITMAP));
diff --git a/ui/base/clipboard/scoped_clipboard_writer.cc b/ui/base/clipboard/scoped_clipboard_writer.cc
index 69ef48e..95cf505 100644
--- a/ui/base/clipboard/scoped_clipboard_writer.cc
+++ b/ui/base/clipboard/scoped_clipboard_writer.cc
@@ -55,6 +55,16 @@ void ScopedClipboardWriter::WriteHTML(const string16& markup,
objects_[Clipboard::CBF_HTML] = parameters;
}
+void ScopedClipboardWriter::WriteRTF(const std::string& rtf_data) {
+ if (rtf_data.empty())
+ return;
+
+ Clipboard::ObjectMapParams parameters;
+ parameters.push_back(Clipboard::ObjectMapParam(rtf_data.begin(),
+ rtf_data.end()));
+ objects_[Clipboard::CBF_RTF] = parameters;
+}
+
void ScopedClipboardWriter::WriteBookmark(const string16& bookmark_title,
const std::string& url) {
if (bookmark_title.empty() || url.empty())
diff --git a/ui/base/clipboard/scoped_clipboard_writer.h b/ui/base/clipboard/scoped_clipboard_writer.h
index e4ae6a6..d4f154b 100644
--- a/ui/base/clipboard/scoped_clipboard_writer.h
+++ b/ui/base/clipboard/scoped_clipboard_writer.h
@@ -44,6 +44,9 @@ class UI_EXPORT ScopedClipboardWriter {
// useful if the HTML fragment contains relative links.
void WriteHTML(const string16& markup, const std::string& source_url);
+ // Adds RTF to the clipboard.
+ void WriteRTF(const std::string& rtf_data);
+
// Adds a bookmark to the clipboard.
void WriteBookmark(const string16& bookmark_title,
const std::string& url);