summaryrefslogtreecommitdiffstats
path: root/webkit/port/platform/ClipboardUtilitiesWin.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'webkit/port/platform/ClipboardUtilitiesWin.cpp')
-rw-r--r--webkit/port/platform/ClipboardUtilitiesWin.cpp193
1 files changed, 135 insertions, 58 deletions
diff --git a/webkit/port/platform/ClipboardUtilitiesWin.cpp b/webkit/port/platform/ClipboardUtilitiesWin.cpp
index a35794f..f23c2fe 100644
--- a/webkit/port/platform/ClipboardUtilitiesWin.cpp
+++ b/webkit/port/platform/ClipboardUtilitiesWin.cpp
@@ -41,6 +41,20 @@
namespace WebCore {
+FORMATETC* cfHDropFormat()
+{
+ static FORMATETC urlFormat = {CF_HDROP, 0, DVASPECT_CONTENT, -1, TYMED_HGLOBAL};
+ return &urlFormat;
+}
+
+//Firefox text/html
+static FORMATETC* texthtmlFormat()
+{
+ static UINT cf = RegisterClipboardFormat(L"text/html");
+ static FORMATETC texthtmlFormat = {cf, 0, DVASPECT_CONTENT, -1, TYMED_HGLOBAL};
+ return &texthtmlFormat;
+}
+
HGLOBAL createGlobalData(const KURL& url, const String& title)
{
String mutableURL(url.string());
@@ -56,77 +70,86 @@ HGLOBAL createGlobalData(const KURL& url, const String& title)
return cbData;
}
-HGLOBAL createGlobalData(String str)
-{
- SIZE_T size = (str.length() + 1) * sizeof(UChar);
- HGLOBAL cbData = ::GlobalAlloc(GPTR, size);
- if (cbData) {
- void* buffer = ::GlobalLock(cbData);
- memcpy(buffer, str.charactersWithNullTermination(), size);
- ::GlobalUnlock(cbData);
- }
- return cbData;
+HGLOBAL createGlobalData(const String& str)
+{
+ HGLOBAL globalData = ::GlobalAlloc(GPTR, (str.length() + 1) * sizeof(UChar));
+ if (!globalData)
+ return 0;
+ UChar* buffer = static_cast<UChar*>(::GlobalLock(globalData));
+ memcpy(buffer, str.characters(), str.length() * sizeof(UChar));
+ buffer[str.length()] = 0;
+ ::GlobalUnlock(globalData);
+ return globalData;
}
-HGLOBAL createGlobalData(CString str)
+HGLOBAL createGlobalData(const Vector<char>& vector)
{
- SIZE_T size = str.length() * sizeof(char);
- HGLOBAL cbData = ::GlobalAlloc(GPTR, size + 1);
- if (cbData) {
- char* buffer = static_cast<char*>(::GlobalLock(cbData));
- memcpy(buffer, str.data(), size);
- buffer[size] = 0;
- ::GlobalUnlock(cbData);
- }
- return cbData;
+ HGLOBAL globalData = ::GlobalAlloc(GPTR, vector.size() + 1);
+ if (!globalData)
+ return 0;
+ char* buffer = static_cast<char*>(::GlobalLock(globalData));
+ memcpy(buffer, vector.data(), vector.size());
+ buffer[vector.size()] = 0;
+ ::GlobalUnlock(globalData);
+ return globalData;
+}
+
+static void append(Vector<char>& vector, const char* string)
+{
+ vector.append(string, strlen(string));
+}
+
+static void append(Vector<char>& vector, const CString& string)
+{
+ vector.append(string.data(), string.length());
}
// Documentation for the CF_HTML format is available at http://msdn.microsoft.com/workshop/networking/clipboard/htmlclipboard.asp
-DeprecatedCString markupToCF_HTML(const String& markup, const String& srcURL)
+void markupToCF_HTML(const String& markup, const String& srcURL, Vector<char>& result)
{
- if (!markup.length())
- return DeprecatedCString();
+ if (markup.isEmpty())
+ return;
- DeprecatedCString cf_html ("Version:0.9");
- DeprecatedCString startHTML ("\nStartHTML:");
- DeprecatedCString endHTML ("\nEndHTML:");
- DeprecatedCString startFragment ("\nStartFragment:");
- DeprecatedCString endFragment ("\nEndFragment:");
- DeprecatedCString sourceURL ("\nSourceURL:");
+ #define MAX_DIGITS 10
+ #define MAKE_NUMBER_FORMAT_1(digits) MAKE_NUMBER_FORMAT_2(digits)
+ #define MAKE_NUMBER_FORMAT_2(digits) "%0" #digits "u"
+ #define NUMBER_FORMAT MAKE_NUMBER_FORMAT_1(MAX_DIGITS)
- bool shouldFillSourceURL = !srcURL.isEmpty() && (srcURL != "about:blank");
- if (shouldFillSourceURL)
- sourceURL.append(srcURL.utf8().data());
+ const char* header = "Version:0.9\n"
+ "StartHTML:" NUMBER_FORMAT "\n"
+ "EndHTML:" NUMBER_FORMAT "\n"
+ "StartFragment:" NUMBER_FORMAT "\n"
+ "EndFragment:" NUMBER_FORMAT "\n";
+ const char* sourceURLPrefix = "SourceURL:";
- DeprecatedCString startMarkup ("\n<HTML>\n<BODY>\n<!--StartFragment-->\n");
- DeprecatedCString endMarkup ("\n<!--EndFragment-->\n</BODY>\n</HTML>");
+ const char* startMarkup = "<HTML>\n<BODY>\n<!--StartFragment-->\n";
+ const char* endMarkup = "\n<!--EndFragment-->\n</BODY>\n</HTML>";
- // calculate offsets
- const unsigned UINT_MAXdigits = 10; // number of digits in UINT_MAX in base 10
- unsigned startHTMLOffset = cf_html.length() + startHTML.length() + endHTML.length() + startFragment.length() + endFragment.length() + (shouldFillSourceURL ? sourceURL.length() : 0) + (4*UINT_MAXdigits);
- unsigned startFragmentOffset = startHTMLOffset + startMarkup.length();
+ CString sourceURLUTF8 = srcURL == blankURL() ? "" : srcURL.utf8();
CString markupUTF8 = markup.utf8();
- unsigned endFragmentOffset = startFragmentOffset + markupUTF8.length();
- unsigned endHTMLOffset = endFragmentOffset + endMarkup.length();
-
- // fill in needed data
- startHTML.append(String::format("%010u", startHTMLOffset).deprecatedString().utf8());
- endHTML.append(String::format("%010u", endHTMLOffset).deprecatedString().utf8());
- startFragment.append(String::format("%010u", startFragmentOffset).deprecatedString().utf8());
- endFragment.append(String::format("%010u", endFragmentOffset).deprecatedString().utf8());
- startMarkup.append(markupUTF8.data());
- // create full cf_html string from the fragments
- cf_html.append(startHTML);
- cf_html.append(endHTML);
- cf_html.append(startFragment);
- cf_html.append(endFragment);
- if (shouldFillSourceURL)
- cf_html.append(sourceURL);
- cf_html.append(startMarkup);
- cf_html.append(endMarkup);
+ // calculate offsets
+ unsigned startHTMLOffset = strlen(header) - strlen(NUMBER_FORMAT) * 4 + MAX_DIGITS * 4;
+ if (sourceURLUTF8.length())
+ startHTMLOffset += strlen(sourceURLPrefix) + sourceURLUTF8.length() + 1;
+ unsigned startFragmentOffset = startHTMLOffset + strlen(startMarkup);
+ unsigned endFragmentOffset = startFragmentOffset + markupUTF8.length();
+ unsigned endHTMLOffset = endFragmentOffset + strlen(endMarkup);
- return cf_html;
+ append(result, String::format(header, startHTMLOffset, endHTMLOffset, startFragmentOffset, endFragmentOffset).utf8());
+ if (sourceURLUTF8.length()) {
+ append(result, sourceURLPrefix);
+ append(result, sourceURLUTF8);
+ result.append('\n');
+ }
+ append(result, startMarkup);
+ append(result, markupUTF8);
+ append(result, endMarkup);
+
+ #undef MAX_DIGITS
+ #undef MAKE_NUMBER_FORMAT_1
+ #undef MAKE_NUMBER_FORMAT_2
+ #undef NUMBER_FORMAT
}
String urlToMarkup(const KURL& url, const String& title)
@@ -156,7 +179,7 @@ String urlToImageMarkup(const KURL& url, const String& altStr) {
void replaceNewlinesWithWindowsStyleNewlines(String& str)
{
static const UChar Newline = '\n';
- static const String WindowsNewline("\r\n");
+ static const char* const WindowsNewline("\r\n");
str.replace(Newline, WindowsNewline);
}
@@ -167,6 +190,60 @@ void replaceNBSPWithSpace(String& str)
str.replace(NonBreakingSpaceCharacter, SpaceCharacter);
}
+FORMATETC* urlWFormat()
+{
+ static UINT cf = RegisterClipboardFormat(L"UniformResourceLocatorW");
+ static FORMATETC urlFormat = {cf, 0, DVASPECT_CONTENT, -1, TYMED_HGLOBAL};
+ return &urlFormat;
+}
+
+FORMATETC* urlFormat()
+{
+ static UINT cf = RegisterClipboardFormat(L"UniformResourceLocator");
+ static FORMATETC urlFormat = {cf, 0, DVASPECT_CONTENT, -1, TYMED_HGLOBAL};
+ return &urlFormat;
+}
+
+FORMATETC* plainTextFormat()
+{
+ static FORMATETC textFormat = {CF_TEXT, 0, DVASPECT_CONTENT, -1, TYMED_HGLOBAL};
+ return &textFormat;
+}
+
+FORMATETC* plainTextWFormat()
+{
+ static FORMATETC textFormat = {CF_UNICODETEXT, 0, DVASPECT_CONTENT, -1, TYMED_HGLOBAL};
+ return &textFormat;
+}
+
+FORMATETC* filenameWFormat()
+{
+ static UINT cf = RegisterClipboardFormat(L"FileNameW");
+ static FORMATETC urlFormat = {cf, 0, DVASPECT_CONTENT, -1, TYMED_HGLOBAL};
+ return &urlFormat;
+}
+
+FORMATETC* filenameFormat()
+{
+ static UINT cf = RegisterClipboardFormat(L"FileName");
+ static FORMATETC urlFormat = {cf, 0, DVASPECT_CONTENT, -1, TYMED_HGLOBAL};
+ return &urlFormat;
+}
+
+//MSIE HTML Format
+FORMATETC* htmlFormat()
+{
+ static UINT cf = RegisterClipboardFormat(L"HTML Format");
+ static FORMATETC htmlFormat = {cf, 0, DVASPECT_CONTENT, -1, TYMED_HGLOBAL};
+ return &htmlFormat;
+}
+
+FORMATETC* smartPasteFormat()
+{
+ static UINT cf = RegisterClipboardFormat(L"WebKit Smart Paste Format");
+ static FORMATETC htmlFormat = {cf, 0, DVASPECT_CONTENT, -1, TYMED_HGLOBAL};
+ return &htmlFormat;
+}
PassRefPtr<DocumentFragment> fragmentFromFilenames(Document*, const IDataObject*)
{