summaryrefslogtreecommitdiffstats
path: root/webkit/port/platform/win/ClipboardUtilitiesWin.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'webkit/port/platform/win/ClipboardUtilitiesWin.cpp')
-rw-r--r--webkit/port/platform/win/ClipboardUtilitiesWin.cpp323
1 files changed, 0 insertions, 323 deletions
diff --git a/webkit/port/platform/win/ClipboardUtilitiesWin.cpp b/webkit/port/platform/win/ClipboardUtilitiesWin.cpp
deleted file mode 100644
index f23c2fe..0000000
--- a/webkit/port/platform/win/ClipboardUtilitiesWin.cpp
+++ /dev/null
@@ -1,323 +0,0 @@
-/*
- * Copyright (C) 2007 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "config.h"
-#include "ClipboardUtilitiesWin.h"
-
-#include "KURL.h"
-#include "CString.h"
-#include "DocumentFragment.h"
-#include "markup.h"
-#include "PlatformString.h"
-#include "TextEncoding.h"
-#include <shlobj.h>
-#include <shlwapi.h>
-#include <shellapi.h>
-#include <wininet.h> // for INTERNET_MAX_URL_LENGTH
-
-#include "base/clipboard_util.h"
-
-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());
- String mutableTitle(title);
- SIZE_T size = mutableURL.length() + mutableTitle.length() + 2; // +1 for "\n" and +1 for null terminator
- HGLOBAL cbData = ::GlobalAlloc(GPTR, size * sizeof(UChar));
-
- if (cbData) {
- PWSTR buffer = (PWSTR)::GlobalLock(cbData);
- swprintf_s(buffer, size, L"%s\n%s", mutableURL.charactersWithNullTermination(), mutableTitle.isNull() ? L"" : mutableTitle.charactersWithNullTermination());
- ::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(const Vector<char>& vector)
-{
- 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
-void markupToCF_HTML(const String& markup, const String& srcURL, Vector<char>& result)
-{
- if (markup.isEmpty())
- return;
-
- #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)
-
- 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:";
-
- const char* startMarkup = "<HTML>\n<BODY>\n<!--StartFragment-->\n";
- const char* endMarkup = "\n<!--EndFragment-->\n</BODY>\n</HTML>";
-
- CString sourceURLUTF8 = srcURL == blankURL() ? "" : srcURL.utf8();
- CString markupUTF8 = markup.utf8();
-
- // 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);
-
- 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)
-{
- String markup("<a href=\"");
- markup.append(url.string());
- markup.append("\">");
- markup.append(title);
- markup.append("</a>");
- return markup;
-}
-
-String urlToImageMarkup(const KURL& url, const String& altStr) {
- String markup("<img src=\"");
- markup.append(url.string());
- markup.append("\"");
- if (!altStr.isEmpty()) {
- markup.append(" alt=\"");
- // TODO(dglazkov): escape string
- markup.append(altStr);
- markup.append("\"");
- }
- markup.append("/>");
- return markup;
-}
-
-void replaceNewlinesWithWindowsStyleNewlines(String& str)
-{
- static const UChar Newline = '\n';
- static const char* const WindowsNewline("\r\n");
- str.replace(Newline, WindowsNewline);
-}
-
-void replaceNBSPWithSpace(String& str)
-{
- static const UChar NonBreakingSpaceCharacter = 0xA0;
- static const UChar SpaceCharacter = ' ';
- 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*)
-{
- //FIXME: We should be able to create fragments from files
- return 0;
-}
-
-bool containsFilenames(const IDataObject*)
-{
- //FIXME: We'll want to update this once we can produce fragments from files
- return false;
-}
-
-//Convert a String containing CF_HTML formatted text to a DocumentFragment
-PassRefPtr<DocumentFragment> fragmentFromCF_HTML(Document* doc, const String& cf_html)
-{
- // obtain baseURL if present
- String srcURLStr("sourceURL:");
- String srcURL;
- unsigned lineStart = cf_html.find(srcURLStr, 0, false);
- if (lineStart != -1) {
- unsigned srcEnd = cf_html.find("\n", lineStart, false);
- unsigned srcStart = lineStart+srcURLStr.length();
- String rawSrcURL = cf_html.substring(srcStart, srcEnd-srcStart);
- replaceNBSPWithSpace(rawSrcURL);
- srcURL = rawSrcURL.stripWhiteSpace();
- }
-
- // find the markup between "<!--StartFragment -->" and "<!--EndFragment -->", accounting for browser quirks
- unsigned markupStart = cf_html.find("<html", 0, false);
- unsigned tagStart = cf_html.find("startfragment", markupStart, false);
- unsigned fragmentStart = cf_html.find('>', tagStart) + 1;
- unsigned tagEnd = cf_html.find("endfragment", fragmentStart, false);
- unsigned fragmentEnd = cf_html.reverseFind('<', tagEnd);
- String markup = cf_html.substring(fragmentStart, fragmentEnd - fragmentStart).stripWhiteSpace();
-
- return createFragmentFromMarkup(doc, markup, srcURL);
-}
-
-
-PassRefPtr<DocumentFragment> fragmentFromHTML(Document* doc, IDataObject* data)
-{
- if (!doc || !data)
- return 0;
-
- STGMEDIUM store;
- String html;
- String srcURL;
- if (SUCCEEDED(data->GetData(ClipboardUtil::GetHtmlFormat(), &store))) {
- //MS HTML Format parsing
- char* data = (char*)GlobalLock(store.hGlobal);
- SIZE_T dataSize = ::GlobalSize(store.hGlobal);
- String cf_html(UTF8Encoding().decode(data, dataSize));
- GlobalUnlock(store.hGlobal);
- ReleaseStgMedium(&store);
- if (PassRefPtr<DocumentFragment> fragment = fragmentFromCF_HTML(doc, cf_html))
- return fragment;
- }
- if (SUCCEEDED(data->GetData(ClipboardUtil::GetTextHtmlFormat(), &store))) {
- //raw html
- UChar* data = (UChar*)GlobalLock(store.hGlobal);
- html = String(data);
- GlobalUnlock(store.hGlobal);
- ReleaseStgMedium(&store);
- return createFragmentFromMarkup(doc, html, srcURL);
- }
-
- return 0;
-}
-
-bool containsHTML(IDataObject* data)
-{
- return SUCCEEDED(data->QueryGetData(ClipboardUtil::GetTextHtmlFormat())) ||
- SUCCEEDED(data->QueryGetData(ClipboardUtil::GetHtmlFormat()));
-}
-
-} // namespace WebCore