diff options
author | Simon Hausmann <simon.hausmann@nokia.com> | 2012-05-07 11:21:11 +0200 |
---|---|---|
committer | Simon Hausmann <simon.hausmann@nokia.com> | 2012-05-07 11:21:11 +0200 |
commit | 2cf6c8816a73e0132bd8fa3b509d62d7c51b6e47 (patch) | |
tree | 988e8c5b116dd0466244ae2fe5af8ee9be926d76 /Source/WebKit/chromium/src/WebDragData.cpp | |
parent | dd91e772430dc294e3bf478c119ef8d43c0a3358 (diff) | |
download | qtwebkit-2cf6c8816a73e0132bd8fa3b509d62d7c51b6e47.tar.gz |
Imported WebKit commit 7e538425aa020340619e927792f3d895061fb54b (http://svn.webkit.org/repository/webkit/trunk@116286)
Diffstat (limited to 'Source/WebKit/chromium/src/WebDragData.cpp')
-rw-r--r-- | Source/WebKit/chromium/src/WebDragData.cpp | 107 |
1 files changed, 53 insertions, 54 deletions
diff --git a/Source/WebKit/chromium/src/WebDragData.cpp b/Source/WebKit/chromium/src/WebDragData.cpp index 322dfbaeb..61d86a388 100644 --- a/Source/WebKit/chromium/src/WebDragData.cpp +++ b/Source/WebKit/chromium/src/WebDragData.cpp @@ -33,6 +33,8 @@ #include "ChromiumDataObject.h" #include "ClipboardMimeTypes.h" +#include "DataTransferItem.h" +#include "DraggedIsolatedFileSystem.h" #include "platform/WebData.h" #include "platform/WebString.h" #include "platform/WebURL.h" @@ -69,57 +71,34 @@ void WebDragData::assign(const WebDragData& other) WebVector<WebDragData::Item> WebDragData::items() const { Vector<Item> itemList; - const HashSet<String>& types = m_private->types(); - if (types.contains(mimeTypeTextPlain)) { - Item item; - item.storageType = Item::StorageTypeString; - item.stringType = String(mimeTypeTextPlain); - bool ignored; - item.stringData = m_private->getData(mimeTypeTextPlain, ignored); + for (size_t i = 0; i < m_private->length(); ++i) { + ChromiumDataObjectItem* originalItem = m_private->item(i).get(); + WebDragData::Item item; + if (originalItem->kind() == DataTransferItem::kindString) { + item.storageType = Item::StorageTypeString; + item.stringType = originalItem->type(); + item.stringData = originalItem->internalGetAsString(); + } else if (originalItem->kind() == DataTransferItem::kindFile) { + if (originalItem->sharedBuffer()) { + item.storageType = Item::StorageTypeBinaryData; + item.binaryData = originalItem->sharedBuffer(); + } else if (originalItem->isFilename()) { + item.storageType = Item::StorageTypeFilename; + RefPtr<WebCore::Blob> blob = originalItem->getAsFile(); + if (blob->isFile()) { + File* file = static_cast<File*>(blob.get()); + item.filenameData = file->path(); + item.displayNameData = file->name(); + } else + ASSERT_NOT_REACHED(); + } else + ASSERT_NOT_REACHED(); + } else + ASSERT_NOT_REACHED(); + item.title = originalItem->title(); + item.baseURL = originalItem->baseURL(); itemList.append(item); } - if (types.contains(mimeTypeTextURIList)) { - Item item; - item.storageType = Item::StorageTypeString; - item.stringType = String(mimeTypeTextURIList); - bool ignored; - item.stringData = m_private->getData(mimeTypeURL, ignored); - item.title = m_private->urlTitle(); - itemList.append(item); - } - if (types.contains(mimeTypeTextHTML)) { - Item item; - item.storageType = Item::StorageTypeString; - item.stringType = String(mimeTypeTextHTML); - bool ignored; - item.stringData = m_private->getData(mimeTypeTextHTML, ignored); - item.baseURL = m_private->htmlBaseUrl(); - itemList.append(item); - } - if (types.contains(mimeTypeDownloadURL)) { - Item item; - item.storageType = Item::StorageTypeString; - item.stringType = String(mimeTypeDownloadURL); - bool ignored; - item.stringData = m_private->getData(mimeTypeDownloadURL, ignored); - itemList.append(item); - } - const HashMap<String, String>& customData = m_private->customData(); - for (HashMap<String, String>::const_iterator it = customData.begin(); it != customData.end(); ++it) { - Item item; - item.storageType = Item::StorageTypeString; - item.stringType = it->first; - item.stringData = it->second; - itemList.append(item); - } - if (m_private->fileContent()) { - Item item; - item.storageType = Item::StorageTypeBinaryData; - item.binaryData = m_private->fileContent(); - item.title = m_private->fileContentFilename(); - itemList.append(item); - } - // We don't handle filenames here, since they are never used for dragging out. return itemList; } @@ -135,14 +114,15 @@ void WebDragData::addItem(const Item& item) ensureMutable(); switch (item.storageType) { case Item::StorageTypeString: - m_private->setData(item.stringType, item.stringData); if (String(item.stringType) == mimeTypeTextURIList) - m_private->setUrlTitle(item.title); + m_private->setURLAndTitle(item.stringData, item.title); else if (String(item.stringType) == mimeTypeTextHTML) - m_private->setHtmlBaseUrl(item.baseURL); + m_private->setHTMLAndBaseURL(item.stringData, item.baseURL); + else + m_private->setData(item.stringType, item.stringData); return; case Item::StorageTypeFilename: - m_private->addFilename(item.filenameData); + m_private->addFilename(item.filenameData, item.displayNameData); return; case Item::StorageTypeBinaryData: // This should never happen when dragging in. @@ -150,6 +130,26 @@ void WebDragData::addItem(const Item& item) } } +WebString WebDragData::filesystemId() const +{ +#if ENABLE(FILE_SYSTEM) + ASSERT(!isNull()); + DraggedIsolatedFileSystem* filesystem = DraggedIsolatedFileSystem::from(m_private); + if (filesystem) + return filesystem->filesystemId(); +#endif + return WebString(); +} + +void WebDragData::setFilesystemId(const WebString& filesystemId) +{ +#if ENABLE(FILE_SYSTEM) + // The ID is an opaque string, given by and validated by chromium port. + ensureMutable(); + DraggedIsolatedFileSystem::provideTo(m_private, DraggedIsolatedFileSystem::supplementName(), DraggedIsolatedFileSystem::create(filesystemId)); +#endif +} + WebDragData::WebDragData(const WTF::PassRefPtr<WebCore::ChromiumDataObject>& data) : m_private(static_cast<WebDragDataPrivate*>(data.leakRef())) { @@ -168,7 +168,6 @@ WebDragData::operator WTF::PassRefPtr<WebCore::ChromiumDataObject>() const void WebDragData::assign(WebDragDataPrivate* p) { - ASSERT(!p || p->storageMode() == ChromiumDataObject::Buffered); // p is already ref'd for us by the caller if (m_private) m_private->deref(); |