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