Index: base/clipboard_win.cc |
diff --git a/base/clipboard_win.cc b/base/clipboard_win.cc |
index 814065d7b17d943e095314b33e7439bfca331661..adc2c25f9fb96236f82b8fae8e91d2ed83c21b79 100644 |
--- a/base/clipboard_win.cc |
+++ b/base/clipboard_win.cc |
@@ -178,14 +178,13 @@ void Clipboard::WriteHTML(const char* markup_data, |
size_t markup_len, |
const char* url_data, |
size_t url_len) { |
- std::string html_fragment, |
- markup(markup_data, markup_len), |
- url; |
+ std::string markup(markup_data, markup_len); |
+ std::string url; |
if (url_len > 0) |
url.assign(url_data, url_len); |
- MarkupToHTMLClipboardFormat(markup, url, &html_fragment); |
+ std::string html_fragment = ClipboardUtil::HtmlToCFHtml(markup, url); |
HGLOBAL glob = CreateGlobalData(html_fragment); |
WriteToClipboard(GetHtmlFormatType(), glob); |
@@ -437,7 +436,9 @@ void Clipboard::ReadHTML(std::wstring* markup, std::string* src_url) const { |
std::string html_fragment(static_cast<const char*>(::GlobalLock(data))); |
::GlobalUnlock(data); |
- ParseHTMLClipboardFormat(html_fragment, markup, src_url); |
+ std::string markup_utf8; |
+ ClipboardUtil::CFHtmlToHtml(html_fragment, &markup_utf8, src_url); |
+ markup->assign(UTF8ToWide(markup_utf8)); |
} |
void Clipboard::ReadBookmark(std::wstring* title, std::string* url) const { |
@@ -509,104 +510,6 @@ void Clipboard::ReadFiles(std::vector<std::wstring>* files) const { |
} |
// static |
-void Clipboard::MarkupToHTMLClipboardFormat(const std::string& markup, |
- const std::string& src_url, |
- std::string* html_fragment) { |
- DCHECK(html_fragment); |
- // Documentation for the CF_HTML format is available at |
- // http://msdn.microsoft.com/workshop/networking/clipboard/htmlclipboard.asp |
- |
- if (markup.empty()) { |
- html_fragment->clear(); |
- return; |
- } |
- |
- html_fragment->assign("Version:0.9"); |
- |
- std::string start_html("\nStartHTML:"); |
- std::string end_html("\nEndHTML:"); |
- std::string start_fragment("\nStartFragment:"); |
- std::string end_fragment("\nEndFragment:"); |
- std::string source_url("\nSourceURL:"); |
- |
- bool has_source_url = !src_url.empty() && |
- !StartsWithASCII(src_url, "about:", false); |
- if (has_source_url) |
- source_url.append(src_url); |
- |
- std::string start_markup("\n<HTML>\n<BODY>\n<!--StartFragment-->\n"); |
- std::string end_markup("\n<!--EndFragment-->\n</BODY>\n</HTML>"); |
- |
- // calculate offsets |
- const size_t kMaxDigits = 10; // number of digits in UINT_MAX in base 10 |
- |
- size_t start_html_offset, start_fragment_offset; |
- size_t end_fragment_offset, end_html_offset; |
- |
- start_html_offset = html_fragment->length() + |
- start_html.length() + end_html.length() + |
- start_fragment.length() + end_fragment.length() + |
- (has_source_url ? source_url.length() : 0) + |
- (4*kMaxDigits); |
- |
- start_fragment_offset = start_html_offset + start_markup.length(); |
- end_fragment_offset = start_fragment_offset + markup.length(); |
- end_html_offset = end_fragment_offset + end_markup.length(); |
- |
- // fill in needed data |
- start_html.append(StringPrintf("%010u", start_html_offset)); |
- end_html.append(StringPrintf("%010u", end_html_offset)); |
- start_fragment.append(StringPrintf("%010u", start_fragment_offset)); |
- end_fragment.append(StringPrintf("%010u", end_fragment_offset)); |
- start_markup.append(markup); |
- |
- // create full html_fragment string from the fragments |
- html_fragment->append(start_html); |
- html_fragment->append(end_html); |
- html_fragment->append(start_fragment); |
- html_fragment->append(end_fragment); |
- if (has_source_url) |
- html_fragment->append(source_url); |
- html_fragment->append(start_markup); |
- html_fragment->append(end_markup); |
-} |
- |
-// static |
-void Clipboard::ParseHTMLClipboardFormat(const std::string& html_frag, |
- std::wstring* markup, |
- std::string* src_url) { |
- if (src_url) { |
- // Obtain SourceURL, if present |
- std::string src_url_str("SourceURL:"); |
- size_t line_start = html_frag.find(src_url_str, 0); |
- if (line_start != std::string::npos) { |
- size_t src_start = line_start+src_url_str.length(); |
- size_t src_end = html_frag.find("\n", line_start); |
- |
- if (src_end != std::string::npos) |
- *src_url = html_frag.substr(src_start, src_end - src_start); |
- } |
- } |
- |
- if (markup) { |
- // Find the markup between "<!--StartFragment -->" and |
- // "<!--EndFragment -->", accounting for browser quirks |
- size_t markup_start = html_frag.find('<', 0); |
- size_t tag_start = html_frag.find("StartFragment", markup_start); |
- size_t frag_start = html_frag.find('>', tag_start) + 1; |
- // Here we do something slightly differently than WebKit. Webkit does a |
- // forward find for EndFragment, but that seems to be a bug if the html |
- // fragment actually includes the string "EndFragment" |
- size_t tag_end = html_frag.rfind("EndFragment", std::string::npos); |
- size_t frag_end = html_frag.rfind('<', tag_end); |
- |
- TrimWhitespace(UTF8ToWide(html_frag.substr(frag_start, |
- frag_end - frag_start)), |
- TRIM_ALL, markup); |
- } |
-} |
- |
-// static |
void Clipboard::ParseBookmarkClipboardFormat(const std::wstring& bookmark, |
std::wstring* title, |
std::string* url) { |