diff options
author | raymes@chromium.org <raymes@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-04-02 17:45:24 +0000 |
---|---|---|
committer | raymes@chromium.org <raymes@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-04-02 17:45:24 +0000 |
commit | 79aedba70423341c301010f226bf81661d01739a (patch) | |
tree | 2e3e734fc9d1351aea893a87d22a261669259c49 /ui/base | |
parent | ec00443bc59ffdcd2eb43a02ddd1ebbf666bde9a (diff) | |
download | chromium_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.cc | 5 | ||||
-rw-r--r-- | ui/base/clipboard/clipboard.h | 10 | ||||
-rw-r--r-- | ui/base/clipboard/clipboard_android.cc | 13 | ||||
-rw-r--r-- | ui/base/clipboard/clipboard_aurax11.cc | 86 | ||||
-rw-r--r-- | ui/base/clipboard/clipboard_gtk.cc | 17 | ||||
-rw-r--r-- | ui/base/clipboard/clipboard_mac.mm | 19 | ||||
-rw-r--r-- | ui/base/clipboard/clipboard_unittest.cc | 21 | ||||
-rw-r--r-- | ui/base/clipboard/clipboard_util_win.cc | 6 | ||||
-rw-r--r-- | ui/base/clipboard/clipboard_util_win.h | 2 | ||||
-rw-r--r-- | ui/base/clipboard/clipboard_win.cc | 31 | ||||
-rw-r--r-- | ui/base/clipboard/scoped_clipboard_writer.cc | 10 | ||||
-rw-r--r-- | ui/base/clipboard/scoped_clipboard_writer.h | 3 |
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); |