18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2007, 2008 Apple Inc. All rights reserved. 38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Redistribution and use in source and binary forms, with or without 58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modification, are permitted provided that the following conditions 68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * are met: 78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 1. Redistributions of source code must retain the above copyright 88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * notice, this list of conditions and the following disclaimer. 98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright 108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * notice, this list of conditions and the following disclaimer in the 118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * documentation and/or other materials provided with the distribution. 128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY 148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR 178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "config.h" 278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "DragData.h" 288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 292fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "COMPtr.h" 308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "ClipboardUtilitiesWin.h" 3165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "Frame.h" 328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "DocumentFragment.h" 338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "PlatformString.h" 348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Markup.h" 358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "TextEncoding.h" 368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <objidl.h> 378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <shlwapi.h> 388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <wininet.h> 392fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include <wtf/Forward.h> 402fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include <wtf/Hashmap.h> 412fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include <wtf/PassRefPtr.h> 422fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include <wtf/RefPtr.h> 438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore { 458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 462fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockDragData::DragData(const DragDataMap& data, const IntPoint& clientPosition, const IntPoint& globalPosition, 472fc2651226baac27029e38c9d6ef883fa32084dbSteve Block DragOperation sourceOperationMask, DragApplicationFlags flags) 482fc2651226baac27029e38c9d6ef883fa32084dbSteve Block : m_clientPosition(clientPosition) 492fc2651226baac27029e38c9d6ef883fa32084dbSteve Block , m_globalPosition(globalPosition) 502fc2651226baac27029e38c9d6ef883fa32084dbSteve Block , m_platformDragData(0) 512fc2651226baac27029e38c9d6ef883fa32084dbSteve Block , m_draggingSourceOperationMask(sourceOperationMask) 522fc2651226baac27029e38c9d6ef883fa32084dbSteve Block , m_applicationFlags(flags) 532fc2651226baac27029e38c9d6ef883fa32084dbSteve Block , m_dragDataMap(data) 542fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{ 552fc2651226baac27029e38c9d6ef883fa32084dbSteve Block} 562fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 5765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochbool DragData::containsURL(Frame*, FilenameConversionPolicy filenamePolicy) const 588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 592fc2651226baac27029e38c9d6ef883fa32084dbSteve Block if (m_platformDragData) 602fc2651226baac27029e38c9d6ef883fa32084dbSteve Block return SUCCEEDED(m_platformDragData->QueryGetData(urlWFormat())) 612fc2651226baac27029e38c9d6ef883fa32084dbSteve Block || SUCCEEDED(m_platformDragData->QueryGetData(urlFormat())) 622fc2651226baac27029e38c9d6ef883fa32084dbSteve Block || (filenamePolicy == ConvertFilenames 632fc2651226baac27029e38c9d6ef883fa32084dbSteve Block && (SUCCEEDED(m_platformDragData->QueryGetData(filenameWFormat())) 642fc2651226baac27029e38c9d6ef883fa32084dbSteve Block || SUCCEEDED(m_platformDragData->QueryGetData(filenameFormat())))); 652fc2651226baac27029e38c9d6ef883fa32084dbSteve Block return m_dragDataMap.contains(urlWFormat()->cfFormat) || m_dragDataMap.contains(urlFormat()->cfFormat) 662fc2651226baac27029e38c9d6ef883fa32084dbSteve Block || (filenamePolicy == ConvertFilenames && (m_dragDataMap.contains(filenameWFormat()->cfFormat) || m_dragDataMap.contains(filenameFormat()->cfFormat))); 672fc2651226baac27029e38c9d6ef883fa32084dbSteve Block} 682fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 692fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockconst DragDataMap& DragData::dragDataMap() 702fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{ 712fc2651226baac27029e38c9d6ef883fa32084dbSteve Block if (!m_dragDataMap.isEmpty() || !m_platformDragData) 722fc2651226baac27029e38c9d6ef883fa32084dbSteve Block return m_dragDataMap; 732fc2651226baac27029e38c9d6ef883fa32084dbSteve Block // Enumerate clipboard content and load it in the map. 742fc2651226baac27029e38c9d6ef883fa32084dbSteve Block COMPtr<IEnumFORMATETC> itr; 752fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 762fc2651226baac27029e38c9d6ef883fa32084dbSteve Block if (FAILED(m_platformDragData->EnumFormatEtc(DATADIR_GET, &itr)) || !itr) 772fc2651226baac27029e38c9d6ef883fa32084dbSteve Block return m_dragDataMap; 782fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 792fc2651226baac27029e38c9d6ef883fa32084dbSteve Block FORMATETC dataFormat; 802fc2651226baac27029e38c9d6ef883fa32084dbSteve Block while (itr->Next(1, &dataFormat, 0) == S_OK) { 812fc2651226baac27029e38c9d6ef883fa32084dbSteve Block Vector<String> dataStrings; 822fc2651226baac27029e38c9d6ef883fa32084dbSteve Block getClipboardData(m_platformDragData, &dataFormat, dataStrings); 832fc2651226baac27029e38c9d6ef883fa32084dbSteve Block if (!dataStrings.isEmpty()) 842fc2651226baac27029e38c9d6ef883fa32084dbSteve Block m_dragDataMap.set(dataFormat.cfFormat, dataStrings); 852fc2651226baac27029e38c9d6ef883fa32084dbSteve Block } 862fc2651226baac27029e38c9d6ef883fa32084dbSteve Block return m_dragDataMap; 878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochString DragData::asURL(Frame*, FilenameConversionPolicy filenamePolicy, String* title) const 908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool success; 922fc2651226baac27029e38c9d6ef883fa32084dbSteve Block return (m_platformDragData) ? getURL(m_platformDragData, filenamePolicy, success, title) : getURL(&m_dragDataMap, filenamePolicy, title); 938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool DragData::containsFiles() const 968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 972fc2651226baac27029e38c9d6ef883fa32084dbSteve Block return (m_platformDragData) ? SUCCEEDED(m_platformDragData->QueryGetData(cfHDropFormat())) : m_dragDataMap.contains(cfHDropFormat()->cfFormat); 988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid DragData::asFilenames(Vector<String>& result) const 1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1022fc2651226baac27029e38c9d6ef883fa32084dbSteve Block if (m_platformDragData) { 1032fc2651226baac27029e38c9d6ef883fa32084dbSteve Block WCHAR filename[MAX_PATH]; 1042fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 1052fc2651226baac27029e38c9d6ef883fa32084dbSteve Block STGMEDIUM medium; 1062fc2651226baac27029e38c9d6ef883fa32084dbSteve Block if (FAILED(m_platformDragData->GetData(cfHDropFormat(), &medium))) 1072fc2651226baac27029e38c9d6ef883fa32084dbSteve Block return; 1082fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 1092fc2651226baac27029e38c9d6ef883fa32084dbSteve Block HDROP hdrop = (HDROP)GlobalLock(medium.hGlobal); 1102fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 1112fc2651226baac27029e38c9d6ef883fa32084dbSteve Block if (!hdrop) 1122fc2651226baac27029e38c9d6ef883fa32084dbSteve Block return; 1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1142fc2651226baac27029e38c9d6ef883fa32084dbSteve Block const unsigned numFiles = DragQueryFileW(hdrop, 0xFFFFFFFF, 0, 0); 1152fc2651226baac27029e38c9d6ef883fa32084dbSteve Block for (unsigned i = 0; i < numFiles; i++) { 1162fc2651226baac27029e38c9d6ef883fa32084dbSteve Block if (!DragQueryFileW(hdrop, 0, filename, WTF_ARRAY_LENGTH(filename))) 1172fc2651226baac27029e38c9d6ef883fa32084dbSteve Block continue; 1182fc2651226baac27029e38c9d6ef883fa32084dbSteve Block result.append((UChar*)filename); 1192fc2651226baac27029e38c9d6ef883fa32084dbSteve Block } 1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1212fc2651226baac27029e38c9d6ef883fa32084dbSteve Block // Free up memory from drag 1222fc2651226baac27029e38c9d6ef883fa32084dbSteve Block DragFinish(hdrop); 1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1242fc2651226baac27029e38c9d6ef883fa32084dbSteve Block GlobalUnlock(medium.hGlobal); 1252fc2651226baac27029e38c9d6ef883fa32084dbSteve Block return; 1262fc2651226baac27029e38c9d6ef883fa32084dbSteve Block } 1272fc2651226baac27029e38c9d6ef883fa32084dbSteve Block result = m_dragDataMap.get(cfHDropFormat()->cfFormat); 1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool DragData::containsPlainText() const 1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1322fc2651226baac27029e38c9d6ef883fa32084dbSteve Block if (m_platformDragData) 1332fc2651226baac27029e38c9d6ef883fa32084dbSteve Block return SUCCEEDED(m_platformDragData->QueryGetData(plainTextWFormat())) 1342fc2651226baac27029e38c9d6ef883fa32084dbSteve Block || SUCCEEDED(m_platformDragData->QueryGetData(plainTextFormat())); 1352fc2651226baac27029e38c9d6ef883fa32084dbSteve Block return m_dragDataMap.contains(plainTextWFormat()->cfFormat) || m_dragDataMap.contains(plainTextFormat()->cfFormat); 1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 13865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochString DragData::asPlainText(Frame*) const 1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool success; 1412fc2651226baac27029e38c9d6ef883fa32084dbSteve Block return (m_platformDragData) ? getPlainText(m_platformDragData, success) : getPlainText(&m_dragDataMap); 1428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool DragData::containsColor() const 1458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 1478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool DragData::canSmartReplace() const 1508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1512fc2651226baac27029e38c9d6ef883fa32084dbSteve Block if (m_platformDragData) 1522fc2651226baac27029e38c9d6ef883fa32084dbSteve Block return SUCCEEDED(m_platformDragData->QueryGetData(smartPasteFormat())); 1532fc2651226baac27029e38c9d6ef883fa32084dbSteve Block return m_dragDataMap.contains(smartPasteFormat()->cfFormat); 1548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool DragData::containsCompatibleContent() const 1578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 15865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return containsPlainText() || containsURL(0) 1592fc2651226baac27029e38c9d6ef883fa32084dbSteve Block || ((m_platformDragData) ? (containsHTML(m_platformDragData) || containsFilenames(m_platformDragData)) 1602fc2651226baac27029e38c9d6ef883fa32084dbSteve Block : (containsHTML(&m_dragDataMap) || containsFilenames(&m_dragDataMap))) 1618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project || containsColor(); 1628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 16465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochPassRefPtr<DocumentFragment> DragData::asFragment(Frame* frame, PassRefPtr<Range>, bool, bool&) const 1658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project /* 1678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Order is richest format first. On OSX this is: 1688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * * Web Archive 1698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * * Filenames 1708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * * HTML 1718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * * RTF 1728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * * TIFF 1738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * * PICT 1748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 1752fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 1762fc2651226baac27029e38c9d6ef883fa32084dbSteve Block if (m_platformDragData) { 1772fc2651226baac27029e38c9d6ef883fa32084dbSteve Block if (containsFilenames(m_platformDragData)) { 1782fc2651226baac27029e38c9d6ef883fa32084dbSteve Block if (PassRefPtr<DocumentFragment> fragment = fragmentFromFilenames(frame->document(), m_platformDragData)) 1792fc2651226baac27029e38c9d6ef883fa32084dbSteve Block return fragment; 1802fc2651226baac27029e38c9d6ef883fa32084dbSteve Block } 1812fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 1822fc2651226baac27029e38c9d6ef883fa32084dbSteve Block if (containsHTML(m_platformDragData)) { 1832fc2651226baac27029e38c9d6ef883fa32084dbSteve Block if (PassRefPtr<DocumentFragment> fragment = fragmentFromHTML(frame->document(), m_platformDragData)) 1842fc2651226baac27029e38c9d6ef883fa32084dbSteve Block return fragment; 1852fc2651226baac27029e38c9d6ef883fa32084dbSteve Block } 1862fc2651226baac27029e38c9d6ef883fa32084dbSteve Block } else { 1872fc2651226baac27029e38c9d6ef883fa32084dbSteve Block if (containsFilenames(&m_dragDataMap)) { 1882fc2651226baac27029e38c9d6ef883fa32084dbSteve Block if (PassRefPtr<DocumentFragment> fragment = fragmentFromFilenames(frame->document(), &m_dragDataMap)) 1892fc2651226baac27029e38c9d6ef883fa32084dbSteve Block return fragment; 1902fc2651226baac27029e38c9d6ef883fa32084dbSteve Block } 1912fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 1922fc2651226baac27029e38c9d6ef883fa32084dbSteve Block if (containsHTML(&m_dragDataMap)) { 1932fc2651226baac27029e38c9d6ef883fa32084dbSteve Block if (PassRefPtr<DocumentFragment> fragment = fragmentFromHTML(frame->document(), &m_dragDataMap)) 1942fc2651226baac27029e38c9d6ef883fa32084dbSteve Block return fragment; 1952fc2651226baac27029e38c9d6ef883fa32084dbSteve Block } 1962fc2651226baac27029e38c9d6ef883fa32084dbSteve Block } 1972fc2651226baac27029e38c9d6ef883fa32084dbSteve Block return 0; 1988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectColor DragData::asColor() const 2018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return Color(); 2038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 206