18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2007 Apple Inc.  All rights reserved.
38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2006, 2007 Apple Inc.  All rights reserved.
48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies)
5f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch * Copyright (C) 2010 Sencha, Inc. All rights reserved.
68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Redistribution and use in source and binary forms, with or without
88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modification, are permitted provided that the following conditions
98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * are met:
108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 1. Redistributions of source code must retain the above copyright
118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *    notice, this list of conditions and the following disclaimer.
128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright
138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *    notice, this list of conditions and the following disclaimer in the
148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *    documentation and/or other materials provided with the distribution.
158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "config.h"
308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "ClipboardQt.h"
318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
32545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch#include "CachedImage.h"
338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Document.h"
340617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen#include "DragData.h"
358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Element.h"
360bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include "FileList.h"
378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Frame.h"
388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "HTMLNames.h"
39a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#include "HTMLParserIdioms.h"
408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Image.h"
418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "IntPoint.h"
428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "KURL.h"
430bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include "NotImplemented.h"
448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "PlatformString.h"
458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Range.h"
468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "RenderImage.h"
47545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch#include "markup.h"
48f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick#include <wtf/text/StringHash.h>
490bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
50545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch#include <QApplication>
51545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch#include <QClipboard>
528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <QList>
538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <QMimeData>
548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <QStringList>
55e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#include <QTextCodec>
568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <QUrl>
578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <qdebug.h>
588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define methodDebug() qDebug("ClipboardQt: %s", __FUNCTION__)
608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore {
628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
63ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Blockstatic bool isTextMimeType(const String& type)
64ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block{
65ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    return type == "text/plain" || type.startsWith("text/plain;");
66ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block}
67ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
68e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarkestatic bool isHtmlMimeType(const String& type)
69e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke{
70e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    return type == "text/html" || type.startsWith("text/html;");
71e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke}
72e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke
730617145a89917ae7735fe1c9538688ab9a577df5Kristian MonsenPassRefPtr<Clipboard> Clipboard::create(ClipboardAccessPolicy policy, DragData* dragData, Frame*)
740617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen{
750617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    return ClipboardQt::create(policy, dragData->platformData());
760617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen}
770617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen
788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectClipboardQt::ClipboardQt(ClipboardAccessPolicy policy, const QMimeData* readableClipboard)
79bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    : Clipboard(policy, DragAndDrop)
808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_readableData(readableClipboard)
818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_writableData(0)
820bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Q_ASSERT(policy == ClipboardReadable || policy == ClipboardTypesReadable);
840bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
86bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian MonsenClipboardQt::ClipboardQt(ClipboardAccessPolicy policy, ClipboardType clipboardType)
87bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    : Clipboard(policy, clipboardType)
888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_readableData(0)
898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_writableData(0)
908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Q_ASSERT(policy == ClipboardReadable || policy == ClipboardWritable || policy == ClipboardNumb);
928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef QT_NO_CLIPBOARD
948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (policy != ClipboardWritable) {
95bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        Q_ASSERT(isForCopyAndPaste());
968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_readableData = QApplication::clipboard()->mimeData();
970bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    }
988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectClipboardQt::~ClipboardQt()
1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
103bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    if (m_writableData && isForCopyAndPaste())
1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_writableData = 0;
1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else
1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        delete m_writableData;
1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_readableData = 0;
1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ClipboardQt::clearData(const String& type)
1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (policy() != ClipboardWritable)
1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_writableData) {
1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_writableData->removeFormat(type);
1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (m_writableData->formats().isEmpty()) {
118bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            if (isForDragAndDrop())
1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                delete m_writableData;
1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_writableData = 0;
1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef QT_NO_CLIPBOARD
124bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    if (isForCopyAndPaste())
1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        QApplication::clipboard()->setMimeData(m_writableData);
1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1290bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochvoid ClipboardQt::clearAllData()
1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (policy() != ClipboardWritable)
1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
1330bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef QT_NO_CLIPBOARD
135bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    if (isForCopyAndPaste())
1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        QApplication::clipboard()->setMimeData(0);
1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else
1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        delete m_writableData;
1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_writableData = 0;
1418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1430bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochString ClipboardQt::getData(const String& type, bool& success) const
1448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (policy() != ClipboardReadable) {
1478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        success = false;
1488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return String();
1498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1500bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
151e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    if (isHtmlMimeType(type) && m_readableData->hasHtml()) {
152e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        success = true;
153e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        return m_readableData->html();
154e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    }
155e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke
156ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    if (isTextMimeType(type) && m_readableData->hasText()) {
157ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        success = true;
158ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        return m_readableData->text();
159ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    }
160ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
1618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_readableData);
162e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    QByteArray rawData = m_readableData->data(type);
163e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    QString data = QTextCodec::codecForName("UTF-16")->toUnicode(rawData);
1648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    success = !data.isEmpty();
165e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    return data;
1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1680bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochbool ClipboardQt::setData(const String& type, const String& data)
1698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (policy() != ClipboardWritable)
1718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
1728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!m_writableData)
1748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_writableData = new QMimeData;
175ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
176ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    if (isTextMimeType(type))
177ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        m_writableData->setText(QString(data));
178e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    else if (isHtmlMimeType(type))
179e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        m_writableData->setHtml(QString(data));
180ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    else {
181ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        QByteArray array(reinterpret_cast<const char*>(data.characters()), data.length() * 2);
182ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        m_writableData->setData(QString(type), array);
183ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    }
184ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
1858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef QT_NO_CLIPBOARD
186bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    if (isForCopyAndPaste())
1878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        QApplication::clipboard()->setMimeData(m_writableData);
1888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
1898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return true;
1908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// extensions beyond IE's API
1938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectHashSet<String> ClipboardQt::types() const
1948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (policy() != ClipboardReadable && policy() != ClipboardTypesReadable)
1968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return HashSet<String>();
1978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_readableData);
1998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    HashSet<String> result;
2008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    QStringList formats = m_readableData->formats();
2018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (int i = 0; i < formats.count(); ++i)
2028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        result.add(formats.at(i));
2038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return result;
2048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2060bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochPassRefPtr<FileList> ClipboardQt::files() const
2070bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
208f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if (policy() != ClipboardReadable || !m_readableData->hasUrls())
209f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        return FileList::create();
210f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
211f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    RefPtr<FileList> fileList = FileList::create();
212f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    QList<QUrl> urls = m_readableData->urls();
213f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
214f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    for (int i = 0; i < urls.size(); i++) {
215f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        QUrl url = urls[i];
216f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        if (url.scheme() != QLatin1String("file"))
217f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            continue;
218f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        fileList->append(File::create(url.toLocalFile()));
219f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    }
220f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
221f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    return fileList.release();
2220bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
2230bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
2240bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochvoid ClipboardQt::setDragImage(CachedImage* image, const IntPoint& point)
2258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    setDragImage(image, 0, point);
2278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ClipboardQt::setDragImageElement(Node* node, const IntPoint& point)
2308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    setDragImage(0, node, point);
2328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ClipboardQt::setDragImage(CachedImage* image, Node *node, const IntPoint &loc)
2358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (policy() != ClipboardImageWritable && policy() != ClipboardWritable)
2378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
2388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_dragImage)
2408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_dragImage->removeClient(this);
2418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_dragImage = image;
2428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_dragImage)
2438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_dragImage->addClient(this);
2440bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
2458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_dragLoc = loc;
2468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_dragImageElement = node;
2478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectDragImageRef ClipboardQt::createDragImage(IntPoint& dragLoc) const
2508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!m_dragImage)
2528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return 0;
2538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    dragLoc = m_dragLoc;
2548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return m_dragImage->image()->nativeImageForCurrentFrame();
2558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic CachedImage* getCachedImage(Element* element)
2598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Attempt to pull CachedImage from element
2618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(element);
2628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RenderObject* renderer = element->renderer();
2630bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!renderer || !renderer->isImage())
2648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return 0;
2650bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
2660bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    RenderImage* image = toRenderImage(renderer);
2678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (image->cachedImage() && !image->cachedImage()->errorOccurred())
2688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return image->cachedImage();
2698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return 0;
2718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2730bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochvoid ClipboardQt::declareAndWriteDragImage(Element* element, const KURL& url, const String& title, Frame* frame)
2748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(frame);
2768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
277545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    // WebCore::writeURL(m_writableDataObject.get(), url, title, true, false);
2788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!m_writableData)
2798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_writableData = new QMimeData;
2808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CachedImage* cachedImage = getCachedImage(element);
2828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!cachedImage || !cachedImage->image() || !cachedImage->isLoaded())
2838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
284545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    QPixmap* pixmap = cachedImage->image()->nativeImageForCurrentFrame();
2858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (pixmap)
286635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        m_writableData->setImageData(*pixmap);
2878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    AtomicString imageURL = element->getAttribute(HTMLNames::srcAttr);
2890bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (imageURL.isEmpty())
2908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
2918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
292a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    KURL fullURL = frame->document()->completeURL(stripLeadingAndTrailingHTMLSpaces(imageURL));
2930bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (fullURL.isEmpty())
2948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
2958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    QList<QUrl> urls;
297231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    urls.append(url);
2988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    urls.append(fullURL);
2998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
300231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    m_writableData->setText(title);
3018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_writableData->setUrls(urls);
3022daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    m_writableData->setHtml(createMarkup(element, IncludeNode, 0, AbsoluteURLs));
3038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef QT_NO_CLIPBOARD
304bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    if (isForCopyAndPaste())
3058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        QApplication::clipboard()->setMimeData(m_writableData);
3068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
3078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3090bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochvoid ClipboardQt::writeURL(const KURL& url, const String& title, Frame* frame)
3108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(frame);
3120bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
3138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    QList<QUrl> urls;
3148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    urls.append(frame->document()->completeURL(url.string()));
3158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!m_writableData)
3168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_writableData = new QMimeData;
3178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_writableData->setUrls(urls);
3180bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    m_writableData->setText(title);
3198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef QT_NO_CLIPBOARD
320bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    if (isForCopyAndPaste())
3218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        QApplication::clipboard()->setMimeData(m_writableData);
3228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
3238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3250bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochvoid ClipboardQt::writeRange(Range* range, Frame* frame)
3268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(range);
3288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(frame);
3290bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
3308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!m_writableData)
3318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_writableData = new QMimeData;
3325abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    QString text = frame->editor()->selectedText();
3338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    text.replace(QChar(0xa0), QLatin1Char(' '));
3348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_writableData->setText(text);
33506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    m_writableData->setHtml(createMarkup(range, 0, AnnotateForInterchange, false, AbsoluteURLs));
3368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef QT_NO_CLIPBOARD
337bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    if (isForCopyAndPaste())
3388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        QApplication::clipboard()->setMimeData(m_writableData);
3398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
3408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3428a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Blockvoid ClipboardQt::writePlainText(const String& str)
3438a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block{
3448a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    if (!m_writableData)
3458a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        m_writableData = new QMimeData;
3468a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    QString text = str;
3478a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    text.replace(QChar(0xa0), QLatin1Char(' '));
3488a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    m_writableData->setText(text);
3498a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block#ifndef QT_NO_CLIPBOARD
350bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    if (isForCopyAndPaste())
3518a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        QApplication::clipboard()->setMimeData(m_writableData);
3528a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block#endif
3538a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block}
3548a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
3550bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochbool ClipboardQt::hasData()
3568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const QMimeData *data = m_readableData ? m_readableData : m_writableData;
3588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!data)
3598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
3608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return data->formats().count() > 0;
3618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
364