| 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) {
 | 
| 
 |