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