15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2009 Google Inc. All rights reserved.
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions are
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * met:
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     * Redistributions of source code must retain the above copyright
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer.
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     * Redistributions in binary form must reproduce the above
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * copyright notice, this list of conditions and the following disclaimer
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * in the documentation and/or other materials provided with the
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * distribution.
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     * Neither the name of Google Inc. nor the names of its
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * contributors may be used to endorse or promote products derived from
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * this software without specific prior written permission.
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h"
325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "core/clipboard/DataObject.h"
3409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "core/clipboard/DataTransferItem.h"
3553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "modules/filesystem/DraggedIsolatedFileSystem.h"
361e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/clipboard/ClipboardMimeTypes.h"
37f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "platform/heap/Handle.h"
385267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#include "public/platform/WebData.h"
395267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#include "public/platform/WebDragData.h"
405267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#include "public/platform/WebString.h"
415267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#include "public/platform/WebURL.h"
425267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#include "public/platform/WebVector.h"
43591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/HashMap.h"
44591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/PassRefPtr.h"
455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)namespace blink {
475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebDragData::initialize()
495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
50d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_private = DataObject::create();
515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebDragData::reset()
545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
55d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_private.reset();
565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebDragData::assign(const WebDragData& other)
595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
60d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_private = other.m_private;
61d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
62d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
639e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)WebDragData::WebDragData(const PassRefPtrWillBeRawPtr<DataObject>& object)
64d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
65d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_private = object;
66d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
67d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
689e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)WebDragData& WebDragData::operator=(const PassRefPtrWillBeRawPtr<DataObject>& object)
69d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
70d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_private = object;
71d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return *this;
72d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
73d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
74d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)DataObject* WebDragData::getValue() const
75d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
76d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return m_private.get();
77d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
78d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
79d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebDragData::ensureMutable()
80d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
81d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    ASSERT(!isNull());
825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebVector<WebDragData::Item> WebDragData::items() const
855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Vector<Item> itemList;
875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (size_t i = 0; i < m_private->length(); ++i) {
8809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        DataObjectItem* originalItem = m_private->item(i).get();
895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        WebDragData::Item item;
9009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        if (originalItem->kind() == DataObjectItem::StringKind) {
915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            item.storageType = Item::StorageTypeString;
925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            item.stringType = originalItem->type();
9309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            item.stringData = originalItem->getAsString();
9409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        } else if (originalItem->kind() == DataObjectItem::FileKind) {
955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (originalItem->sharedBuffer()) {
965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                item.storageType = Item::StorageTypeBinaryData;
975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                item.binaryData = originalItem->sharedBuffer();
985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            } else if (originalItem->isFilename()) {
999e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)                RefPtrWillBeRawPtr<Blob> blob = originalItem->getAsFile();
1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                if (blob->isFile()) {
1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    File* file = toFile(blob.get());
102c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)                    if (file->hasBackingFile()) {
103c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)                        if (file->userVisibility() == File::IsUserVisible) {
104c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)                            item.storageType = Item::StorageTypeFilename;
105c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)                            item.filenameData = file->path();
106c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)                            item.displayNameData = file->name();
107c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)                        } else {
108c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)                            item.storageType = Item::StorageTypeFileSystemFile;
109c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)                            item.fileSystemURL = file->fileSystemURL();
110c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)                            item.fileSystemFileSize = file->size();
111c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)                        }
112a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch                    } else {
113c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)                        // FIXME: support dragging constructed Files across renderers, see http://crbug.com/394955
114c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)                        item.storageType = Item::StorageTypeString;
115c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)                        item.stringType = "text/plain";
116c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)                        item.stringData = file->name();
117a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch                    }
118c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)                } else {
1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    ASSERT_NOT_REACHED();
120c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)                }
121c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)            } else {
1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                ASSERT_NOT_REACHED();
123c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)            }
124c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        } else {
1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            ASSERT_NOT_REACHED();
126c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        }
1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        item.title = originalItem->title();
1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        item.baseURL = originalItem->baseURL();
1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        itemList.append(item);
1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return itemList;
1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebDragData::setItems(const WebVector<Item>& itemList)
1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_private->clearAll();
1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (size_t i = 0; i < itemList.size(); ++i)
1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        addItem(itemList[i]);
1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebDragData::addItem(const Item& item)
1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ensureMutable();
1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    switch (item.storageType) {
1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case Item::StorageTypeString:
1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (String(item.stringType) == mimeTypeTextURIList)
1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            m_private->setURLAndTitle(item.stringData, item.title);
1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        else if (String(item.stringType) == mimeTypeTextHTML)
1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            m_private->setHTMLAndBaseURL(item.stringData, item.baseURL);
1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        else
1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            m_private->setData(item.stringType, item.stringData);
1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case Item::StorageTypeFilename:
1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_private->addFilename(item.filenameData, item.displayNameData);
1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case Item::StorageTypeBinaryData:
1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // This should never happen when dragging in.
1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ASSERT_NOT_REACHED();
159a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        return;
160a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    case Item::StorageTypeFileSystemFile:
161a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        {
162a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch            FileMetadata fileMetadata;
163a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch            fileMetadata.length = item.fileSystemFileSize;
164a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch            m_private->add(File::createForFileSystemFile(item.fileSystemURL, fileMetadata));
165a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        }
166a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        return;
1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebString WebDragData::filesystemId() const
1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(!isNull());
173f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    return m_private.get()->filesystemId();
1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebDragData::setFilesystemId(const WebString& filesystemId)
1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // The ID is an opaque string, given by and validated by chromium port.
1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ensureMutable();
180f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    DraggedIsolatedFileSystem::provideTo(*m_private.get(), DraggedIsolatedFileSystem::supplementName(), DraggedIsolatedFileSystem::create(*m_private.get(), filesystemId));
1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)} // namespace blink
184