summaryrefslogtreecommitdiffstats
path: root/webkit/glue/clipboard_conversion.cc
diff options
context:
space:
mode:
Diffstat (limited to 'webkit/glue/clipboard_conversion.cc')
-rw-r--r--webkit/glue/clipboard_conversion.cc126
1 files changed, 126 insertions, 0 deletions
diff --git a/webkit/glue/clipboard_conversion.cc b/webkit/glue/clipboard_conversion.cc
new file mode 100644
index 0000000..9df3f59
--- /dev/null
+++ b/webkit/glue/clipboard_conversion.cc
@@ -0,0 +1,126 @@
+// Copyright (c) 2008 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "config.h"
+
+#include "webkit/glue/clipboard_conversion.h"
+
+#include "build/build_config.h"
+
+#include "ChromiumDataObject.h"
+#if defined(OS_WIN)
+#include "ClipboardUtilitiesWin.h"
+#endif
+#include "SharedBuffer.h"
+
+#include "webkit/glue/glue_util.h"
+
+namespace {
+
+// TODO(tc): CF_HTML logic should move into the browser process since it only
+// makes sense on Windows.
+std::wstring HTMLToCFHTML(const WebCore::String& html,
+ const WebCore::KURL& url) {
+#if defined(OS_WIN)
+ Vector<char> cf_html_data;
+ markupToCF_HTML(html, url, cf_html_data);
+ WebCore::String cf_html_str(cf_html_data.data(), cf_html_data.size());
+ return webkit_glue::StringToStdWString(cf_html_str);
+#else
+ return std::wstring();
+#endif
+}
+
+WebCore::String CFHTMLToHTML(const std::wstring& cf_html_wstr) {
+#if defined(OS_WIN)
+ WebCore::String cf_html = webkit_glue::StdWStringToString(cf_html_wstr);
+ // Obtain baseURL if present.
+ WebCore::String src_url_str("sourceURL:");
+ WebCore::String src_url;
+ unsigned int line_start = cf_html.find(src_url_str, 0, false);
+ if (line_start != -1) {
+ unsigned int src_end = cf_html.find("\n", line_start, false);
+ unsigned int src_start = line_start + src_url_str.length();
+ WebCore::String raw_src_url = cf_html.substring(src_start, src_end - src_start);
+ replaceNBSPWithSpace(raw_src_url);
+ src_url = raw_src_url.stripWhiteSpace();
+ }
+
+ // find the markup between "<!--StartFragment -->" and "<!--EndFragment
+ // -->", accounting for browser quirks
+ unsigned markup_start = cf_html.find("<html", 0, false);
+ unsigned tag_start = cf_html.find("startfragment", markup_start, false);
+ unsigned fragment_start = cf_html.find('>', tag_start) + 1;
+ unsigned tag_end = cf_html.find("endfragment", fragment_start, false);
+ unsigned fragment_end = cf_html.reverseFind('<', tag_end);
+ WebCore::String markup = cf_html.substring(fragment_start,
+ fragment_end - fragment_start).stripWhiteSpace();
+ return markup;
+#else
+ return WebCore::String();
+#endif
+}
+
+} // namespace
+
+namespace webkit_glue {
+
+WebDropData ChromiumDataObjectToWebDropData(
+ WebCore::ChromiumDataObject* data_object) {
+ WebDropData drop_data;
+ drop_data.url = KURLToGURL(data_object->url);
+ drop_data.url_title = StringToStdWString(data_object->url_title);
+
+ for (size_t i = 0; i < data_object->filenames.size(); ++i) {
+ drop_data.filenames.push_back(StringToStdWString(
+ data_object->filenames[i]));
+ }
+
+ drop_data.plain_text = StringToStdWString(data_object->plain_text);
+
+ drop_data.cf_html = HTMLToCFHTML(data_object->text_html, data_object->url);
+
+ drop_data.text_html = StringToStdWString(data_object->text_html);
+
+ drop_data.file_description_filename = StringToStdWString(
+ data_object->file_content_filename);
+ if (data_object->file_content) {
+ drop_data.file_contents.assign(data_object->file_content->data(),
+ data_object->file_content->size());
+ }
+
+ return drop_data;
+}
+
+PassRefPtr<WebCore::ChromiumDataObject> WebDropDataToChromiumDataObject(
+ const WebDropData& drop_data) {
+ RefPtr<WebCore::ChromiumDataObject> data_object =
+ WebCore::ChromiumDataObject::create();
+ data_object->url = GURLToKURL(drop_data.url);
+ data_object->url_title = StdWStringToString(drop_data.url_title);
+
+ for (size_t i = 0; i < drop_data.filenames.size(); ++i) {
+ data_object->filenames.append(StdWStringToString(drop_data.filenames[i]));
+ }
+
+ data_object->plain_text = StdWStringToString(drop_data.plain_text);
+
+ data_object->text_html = StdWStringToString(drop_data.text_html);
+ if (data_object->text_html.isEmpty()) {
+ // Use CF_HTML only if there's no text/html data.
+ data_object->text_html = CFHTMLToHTML(drop_data.cf_html);
+ }
+
+ data_object->file_content_filename = StdWStringToString(
+ drop_data.file_description_filename);
+ if (!drop_data.file_contents.empty()) {
+ data_object->file_content =
+ WebCore::SharedBuffer::create(drop_data.file_contents.data(),
+ drop_data.file_contents.size());
+ }
+
+ return data_object;
+}
+
+} // namespace webkit_glue