15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/* 25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2007 Apple Inc. All rights reserved. 393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) * Copyright (C) 2013 Google Inc. 45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without 65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions 75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * are met: 85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 1. Redistributions of source code must retain the above copyright 95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer. 105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 2. Redistributions in binary form must reproduce the above copyright 115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer in the 125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * documentation and/or other materials provided with the distribution. 135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY 155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR 185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h" 2853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/platform/DragData.h" 2953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 3093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)#include "core/dom/Document.h" 3193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)#include "core/dom/DocumentFragment.h" 3293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)#include "core/dom/Range.h" 3393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)#include "core/editing/markup.h" 3493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)#include "core/page/Frame.h" 3593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)#include "core/platform/FileSystem.h" 3693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)#include "core/platform/chromium/ChromiumDataObject.h" 3793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)#include "core/platform/chromium/ClipboardMimeTypes.h" 3893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)#include "modules/filesystem/DraggedIsolatedFileSystem.h" 39521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)#include "weborigin/KURL.h" 4093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)#include "wtf/text/WTFString.h" 4193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) 425267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#include "public/platform/Platform.h" 435267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#include "public/platform/WebFileUtilities.h" 445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace WebCore { 465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 47e6d4491e48613634a83c1957c72759da80987961Ben MurdochDragData::DragData(ChromiumDataObject* data, const IntPoint& clientPosition, const IntPoint& globalPosition, 485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) DragOperation sourceOperationMask, DragApplicationFlags flags) 495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) : m_clientPosition(clientPosition) 505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_globalPosition(globalPosition) 515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_platformDragData(data) 525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_draggingSourceOperationMask(sourceOperationMask) 535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_applicationFlags(flags) 5453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles){ 555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)DragData::DragData(const String&, const IntPoint& clientPosition, const IntPoint& globalPosition, 585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) DragOperation sourceOperationMask, DragApplicationFlags flags) 595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) : m_clientPosition(clientPosition) 605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_globalPosition(globalPosition) 615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_platformDragData(0) 625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_draggingSourceOperationMask(sourceOperationMask) 635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_applicationFlags(flags) 645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 6793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)static bool containsHTML(const ChromiumDataObject* dropData) 6893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles){ 6993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) return dropData->types().contains(mimeTypeTextHTML); 7093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)} 7193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) 7293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)bool DragData::containsURL(Frame*, FilenameConversionPolicy filenamePolicy) const 7393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles){ 7493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) return m_platformDragData->types().contains(mimeTypeTextURIList) 7593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) || (filenamePolicy == ConvertFilenames && m_platformDragData->containsFilenames()); 7693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)} 7793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) 7893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)String DragData::asURL(Frame*, FilenameConversionPolicy filenamePolicy, String* title) const 7993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles){ 8093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) String url; 8193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) if (m_platformDragData->types().contains(mimeTypeTextURIList)) 8293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) m_platformDragData->urlAndTitle(url, title); 8393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) else if (filenamePolicy == ConvertFilenames && containsFiles()) 8493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) url = KURL(WebKit::Platform::current()->fileUtilities()->filePathToURL(m_platformDragData->filenames()[0])); 8593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) return url; 8693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)} 8793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) 8893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)bool DragData::containsFiles() const 8993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles){ 9093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) return m_platformDragData->containsFilenames(); 9193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)} 9293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) 9393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)unsigned DragData::numberOfFiles() const 9493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles){ 9593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) return m_platformDragData->filenames().size(); 9693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)} 9793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) 9893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)int DragData::modifierKeyState() const 9993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles){ 10093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) return m_platformDragData->modifierKeyState(); 10193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)} 10293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) 10393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)void DragData::asFilenames(Vector<String>& result) const 10493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles){ 10593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) const Vector<String>& filenames = m_platformDragData->filenames(); 10693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) for (size_t i = 0; i < filenames.size(); ++i) 10793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) result.append(filenames[i]); 10893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)} 1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 11093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)bool DragData::containsPlainText() const 11193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles){ 11293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) return m_platformDragData->types().contains(mimeTypeTextPlain); 11393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)} 11493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) 11593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)String DragData::asPlainText(Frame*) const 11693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles){ 11793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) return m_platformDragData->getData(mimeTypeTextPlain); 11893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)} 11993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) 12093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)bool DragData::canSmartReplace() const 12193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles){ 12293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) // Mimic the situations in which mac allows drag&drop to do a smart replace. 12393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) // This is allowed whenever the drag data contains a 'range' (ie., 12493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) // ClipboardWin::writeRange is called). For example, dragging a link 12593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) // should not result in a space being added. 12693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) return m_platformDragData->types().contains(mimeTypeTextPlain) 12793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) && !m_platformDragData->types().contains(mimeTypeTextURIList); 12893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)} 12993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) 13093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)bool DragData::containsCompatibleContent() const 13193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles){ 13293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) return containsPlainText() 13393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) || containsURL(0) 13493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) || containsHTML(m_platformDragData) 13593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) || containsFiles(); 13693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)} 13793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) 13893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)PassRefPtr<DocumentFragment> DragData::asFragment(Frame* frame, PassRefPtr<Range>, bool, bool&) const 13993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles){ 14093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) /* 14193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) * Order is richest format first. On OSX this is: 14293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) * * Web Archive 14393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) * * Filenames 14493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) * * HTML 14593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) * * RTF 14693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) * * TIFF 14793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) * * PICT 14893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) */ 14993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) 15093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) if (containsFiles()) { 15193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) // FIXME: Implement this. Should be pretty simple to make some HTML 15293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) // and call createFragmentFromMarkup. 15393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) } 15493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) 15593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) if (m_platformDragData->types().contains(mimeTypeTextHTML)) { 15693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) String html; 15793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) KURL baseURL; 15893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) m_platformDragData->htmlAndBaseURL(html, baseURL); 15993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) if (RefPtr<DocumentFragment> fragment = createFragmentFromMarkup(frame->document(), html, baseURL, DisallowScriptingAndPluginContent)) 16093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) return fragment.release(); 16193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) } 16293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) 16393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) return 0; 16493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)} 16593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) 16693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)String DragData::droppedFileSystemId() const 16793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles){ 16893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) DraggedIsolatedFileSystem* filesystem = DraggedIsolatedFileSystem::from(m_platformDragData); 16993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) if (!filesystem) 17093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) return String(); 17193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) return filesystem->filesystemId(); 17293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)} 17393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) 17493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)} // namespace WebCore 175