diff options
Diffstat (limited to 'Source/WebCore/platform/win/DragDataWin.cpp')
-rw-r--r-- | Source/WebCore/platform/win/DragDataWin.cpp | 145 |
1 files changed, 102 insertions, 43 deletions
diff --git a/Source/WebCore/platform/win/DragDataWin.cpp b/Source/WebCore/platform/win/DragDataWin.cpp index 906119d..c5b99ea 100644 --- a/Source/WebCore/platform/win/DragDataWin.cpp +++ b/Source/WebCore/platform/win/DragDataWin.cpp @@ -26,6 +26,7 @@ #include "config.h" #include "DragData.h" +#include "COMPtr.h" #include "ClipboardUtilitiesWin.h" #include "Frame.h" #include "DocumentFragment.h" @@ -35,65 +36,109 @@ #include <objidl.h> #include <shlwapi.h> #include <wininet.h> +#include <wtf/Forward.h> +#include <wtf/Hashmap.h> +#include <wtf/PassRefPtr.h> +#include <wtf/RefPtr.h> namespace WebCore { +DragData::DragData(const DragDataMap& data, const IntPoint& clientPosition, const IntPoint& globalPosition, + DragOperation sourceOperationMask, DragApplicationFlags flags) + : m_clientPosition(clientPosition) + , m_globalPosition(globalPosition) + , m_platformDragData(0) + , m_draggingSourceOperationMask(sourceOperationMask) + , m_applicationFlags(flags) + , m_dragDataMap(data) +{ +} + bool DragData::containsURL(Frame*, FilenameConversionPolicy filenamePolicy) const { - return SUCCEEDED(m_platformDragData->QueryGetData(urlWFormat())) - || SUCCEEDED(m_platformDragData->QueryGetData(urlFormat())) - || (filenamePolicy == ConvertFilenames - && (SUCCEEDED(m_platformDragData->QueryGetData(filenameWFormat())) - || SUCCEEDED(m_platformDragData->QueryGetData(filenameFormat())))); + if (m_platformDragData) + return SUCCEEDED(m_platformDragData->QueryGetData(urlWFormat())) + || SUCCEEDED(m_platformDragData->QueryGetData(urlFormat())) + || (filenamePolicy == ConvertFilenames + && (SUCCEEDED(m_platformDragData->QueryGetData(filenameWFormat())) + || SUCCEEDED(m_platformDragData->QueryGetData(filenameFormat())))); + return m_dragDataMap.contains(urlWFormat()->cfFormat) || m_dragDataMap.contains(urlFormat()->cfFormat) + || (filenamePolicy == ConvertFilenames && (m_dragDataMap.contains(filenameWFormat()->cfFormat) || m_dragDataMap.contains(filenameFormat()->cfFormat))); +} + +const DragDataMap& DragData::dragDataMap() +{ + if (!m_dragDataMap.isEmpty() || !m_platformDragData) + return m_dragDataMap; + // Enumerate clipboard content and load it in the map. + COMPtr<IEnumFORMATETC> itr; + + if (FAILED(m_platformDragData->EnumFormatEtc(DATADIR_GET, &itr)) || !itr) + return m_dragDataMap; + + FORMATETC dataFormat; + while (itr->Next(1, &dataFormat, 0) == S_OK) { + Vector<String> dataStrings; + getClipboardData(m_platformDragData, &dataFormat, dataStrings); + if (!dataStrings.isEmpty()) + m_dragDataMap.set(dataFormat.cfFormat, dataStrings); + } + return m_dragDataMap; } String DragData::asURL(Frame*, FilenameConversionPolicy filenamePolicy, String* title) const { bool success; - return getURL(m_platformDragData, filenamePolicy, success, title); + return (m_platformDragData) ? getURL(m_platformDragData, filenamePolicy, success, title) : getURL(&m_dragDataMap, filenamePolicy, title); } bool DragData::containsFiles() const { - return SUCCEEDED(m_platformDragData->QueryGetData(cfHDropFormat())); + return (m_platformDragData) ? SUCCEEDED(m_platformDragData->QueryGetData(cfHDropFormat())) : m_dragDataMap.contains(cfHDropFormat()->cfFormat); } void DragData::asFilenames(Vector<String>& result) const { - WCHAR filename[MAX_PATH]; - - STGMEDIUM medium; - if (FAILED(m_platformDragData->GetData(cfHDropFormat(), &medium))) - return; - - HDROP hdrop = (HDROP)GlobalLock(medium.hGlobal); - - if (!hdrop) - return; + if (m_platformDragData) { + WCHAR filename[MAX_PATH]; + + STGMEDIUM medium; + if (FAILED(m_platformDragData->GetData(cfHDropFormat(), &medium))) + return; + + HDROP hdrop = (HDROP)GlobalLock(medium.hGlobal); + + if (!hdrop) + return; - const unsigned numFiles = DragQueryFileW(hdrop, 0xFFFFFFFF, 0, 0); - for (unsigned i = 0; i < numFiles; i++) { - if (!DragQueryFileW(hdrop, 0, filename, WTF_ARRAY_LENGTH(filename))) - continue; - result.append((UChar*)filename); - } + const unsigned numFiles = DragQueryFileW(hdrop, 0xFFFFFFFF, 0, 0); + for (unsigned i = 0; i < numFiles; i++) { + if (!DragQueryFileW(hdrop, 0, filename, WTF_ARRAY_LENGTH(filename))) + continue; + result.append((UChar*)filename); + } - // Free up memory from drag - DragFinish(hdrop); + // Free up memory from drag + DragFinish(hdrop); - GlobalUnlock(medium.hGlobal); + GlobalUnlock(medium.hGlobal); + return; + } + result = m_dragDataMap.get(cfHDropFormat()->cfFormat); } bool DragData::containsPlainText() const { - return SUCCEEDED(m_platformDragData->QueryGetData(plainTextWFormat())) - || SUCCEEDED(m_platformDragData->QueryGetData(plainTextFormat())); + if (m_platformDragData) + return SUCCEEDED(m_platformDragData->QueryGetData(plainTextWFormat())) + || SUCCEEDED(m_platformDragData->QueryGetData(plainTextFormat())); + return m_dragDataMap.contains(plainTextWFormat()->cfFormat) || m_dragDataMap.contains(plainTextFormat()->cfFormat); } String DragData::asPlainText(Frame*) const { bool success; - return getPlainText(m_platformDragData, success); + return (m_platformDragData) ? getPlainText(m_platformDragData, success) : getPlainText(&m_dragDataMap); } bool DragData::containsColor() const @@ -103,14 +148,16 @@ bool DragData::containsColor() const bool DragData::canSmartReplace() const { - return SUCCEEDED(m_platformDragData->QueryGetData(smartPasteFormat())); + if (m_platformDragData) + return SUCCEEDED(m_platformDragData->QueryGetData(smartPasteFormat())); + return m_dragDataMap.contains(smartPasteFormat()->cfFormat); } bool DragData::containsCompatibleContent() const { return containsPlainText() || containsURL(0) - || containsHTML(m_platformDragData) - || containsFilenames(m_platformDragData) + || ((m_platformDragData) ? (containsHTML(m_platformDragData) || containsFilenames(m_platformDragData)) + : (containsHTML(&m_dragDataMap) || containsFilenames(&m_dragDataMap))) || containsColor(); } @@ -125,16 +172,29 @@ PassRefPtr<DocumentFragment> DragData::asFragment(Frame* frame, PassRefPtr<Range * * TIFF * * PICT */ - - if (containsFilenames(m_platformDragData)) - if (PassRefPtr<DocumentFragment> fragment = fragmentFromFilenames(frame->document(), m_platformDragData)) - return fragment; - - if (containsHTML(m_platformDragData)) - if (PassRefPtr<DocumentFragment> fragment = fragmentFromHTML(frame->document(), m_platformDragData)) - return fragment; - - return 0; + + if (m_platformDragData) { + if (containsFilenames(m_platformDragData)) { + if (PassRefPtr<DocumentFragment> fragment = fragmentFromFilenames(frame->document(), m_platformDragData)) + return fragment; + } + + if (containsHTML(m_platformDragData)) { + if (PassRefPtr<DocumentFragment> fragment = fragmentFromHTML(frame->document(), m_platformDragData)) + return fragment; + } + } else { + if (containsFilenames(&m_dragDataMap)) { + if (PassRefPtr<DocumentFragment> fragment = fragmentFromFilenames(frame->document(), &m_dragDataMap)) + return fragment; + } + + if (containsHTML(&m_dragDataMap)) { + if (PassRefPtr<DocumentFragment> fragment = fragmentFromHTML(frame->document(), &m_dragDataMap)) + return fragment; + } + } + return 0; } Color DragData::asColor() const @@ -143,4 +203,3 @@ Color DragData::asColor() const } } - |