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