diff options
Diffstat (limited to 'src/core/clipboard_qt.cpp')
-rw-r--r-- | src/core/clipboard_qt.cpp | 359 |
1 files changed, 241 insertions, 118 deletions
diff --git a/src/core/clipboard_qt.cpp b/src/core/clipboard_qt.cpp index a1dba8150..3f49c6e3c 100644 --- a/src/core/clipboard_qt.cpp +++ b/src/core/clipboard_qt.cpp @@ -1,41 +1,5 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtWebEngine module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ +// Copyright (C) 2021 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only // Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be @@ -46,17 +10,26 @@ #include "type_conversion.h" #include "base/logging.h" +#include "base/strings/utf_offset_string_conversions.h" #include "base/strings/utf_string_conversions.h" +#include "base/types/variant_util.h" #include "third_party/skia/include/core/SkBitmap.h" #include "ui/base/clipboard/custom_data_helper.h" #include "ui/base/clipboard/clipboard.h" +#include "ui/base/clipboard/clipboard_monitor.h" #include "ui/base/clipboard/clipboard_constants.h" #include "ui/base/clipboard/clipboard_format_type.h" +#include "ui/base/data_transfer_policy/data_transfer_endpoint.h" +#include "ui/base/ui_base_features.h" +#include <QBuffer> #include <QGuiApplication> #include <QImage> +#include <QImageWriter> #include <QMimeData> +#include <memory> + namespace QtWebEngineCore { static void registerMetaTypes() @@ -75,7 +48,13 @@ ClipboardChangeObserver::ClipboardChangeObserver() void ClipboardChangeObserver::trackChange(QClipboard::Mode mode) { - ++sequenceNumber[mode]; + if (mode == QClipboard::Clipboard) + m_primarySequenceNumber = ui::ClipboardSequenceNumberToken(); + else if (mode == QClipboard::Selection) + m_selectionSequenceNumber = ui::ClipboardSequenceNumberToken(); + else + return; + ui::ClipboardMonitor::GetInstance()->NotifyClipboardDataChanged(); } } // namespace QtWebEngineCore @@ -84,12 +63,12 @@ using namespace QtWebEngineCore; namespace { -QScopedPointer<QMimeData> uncommittedData; +std::unique_ptr<QMimeData> uncommittedData; QMimeData *getUncommittedData() { if (!uncommittedData) uncommittedData.reset(new QMimeData); - return uncommittedData.data(); + return uncommittedData.get(); } } // namespace @@ -106,57 +85,83 @@ Clipboard *Clipboard::Create() namespace QtWebEngineCore { -void ClipboardQt::WritePortableRepresentations(ui::ClipboardBuffer type, const ObjectMap &objects) +#if defined(Q_OS_WIN) +extern std::string HtmlToCFHtml(const std::string &html, const std::string &base_url); +extern void CFHtmlExtractMetadata(const std::string &cf_html, std::string *base_url, + size_t *html_start, size_t *fragment_start, size_t *fragment_end); +#endif // defined(Q_OS_WIN) + +void ClipboardQt::WritePortableAndPlatformRepresentations(ui::ClipboardBuffer type, + const ObjectMap &objects, + std::vector<ui::Clipboard::PlatformRepresentation> platform_representations, + std::unique_ptr<ui::DataTransferEndpoint> data_src) { DCHECK(CalledOnValidThread()); DCHECK(IsSupportedClipboardBuffer(type)); + if (!platform_representations.empty()) + DispatchPlatformRepresentations(std::move(platform_representations)); for (const auto &object : objects) - DispatchPortableRepresentation(object.first, object.second); + DispatchPortableRepresentation(object.second); // Commit the accumulated data. if (uncommittedData) - QGuiApplication::clipboard()->setMimeData(uncommittedData.take(), + QGuiApplication::clipboard()->setMimeData(uncommittedData.release(), type == ui::ClipboardBuffer::kCopyPaste ? QClipboard::Clipboard : QClipboard::Selection); if (type == ui::ClipboardBuffer::kCopyPaste && IsSupportedClipboardBuffer(ui::ClipboardBuffer::kSelection)) { - ObjectMap::const_iterator text_iter = objects.find(PortableFormat::kText); + auto text_iter = objects.find(base::VariantIndexOfType<Data, TextData>()); if (text_iter != objects.end()) { // Copy text and SourceTag to the selection clipboard. - WritePortableRepresentations(ui::ClipboardBuffer::kSelection, - ObjectMap(text_iter, text_iter + 1)); + WritePortableAndPlatformRepresentations(ui::ClipboardBuffer::kSelection, + ObjectMap(text_iter, ++text_iter), + {}, + nullptr); } } + m_dataSrc[type] = std::move(data_src); } -void ClipboardQt::WritePlatformRepresentations(ui::ClipboardBuffer buffer, std::vector<ui::Clipboard::PlatformRepresentation> platform_representations) -{ - DCHECK(CalledOnValidThread()); - DCHECK(IsSupportedClipboardBuffer(buffer)); - DispatchPlatformRepresentations(std::move(platform_representations)); -} - -void ClipboardQt::WriteText(const char *text_data, size_t text_len) +void ClipboardQt::WriteText(base::StringPiece text) { - getUncommittedData()->setText(QString::fromUtf8(text_data, text_len)); + getUncommittedData()->setText(toQString(text)); } -void ClipboardQt::WriteHTML(const char *markup_data, size_t markup_len, const char *url_data, size_t url_len) +void ClipboardQt::WriteHTML(base::StringPiece markup, absl::optional<base::StringPiece> source_url) { - QString markup_string = QString::fromUtf8(markup_data, markup_len); + QString markup_string = toQString(markup); #if defined (Q_OS_MACOS) // We need to prepend the charset on macOS to prevent garbled Unicode characters // when pasting to certain applications (e.g. Notes, TextEdit) // Mirrors the behavior in ui/base/clipboard/clipboard_mac.mm in Chromium. markup_string.prepend(QLatin1String("<meta charset='utf-8'>")); #endif + +#if !defined(Q_OS_WIN) getUncommittedData()->setHtml(markup_string); +#else + QString url; + if (source_url) + url = toQString(*source_url); + + std::string cf_html = HtmlToCFHtml(markup_string.toStdString(), url.toStdString()); + size_t html_start = std::string::npos; + size_t fragment_start = std::string::npos; + size_t fragment_end = std::string::npos; + CFHtmlExtractMetadata(cf_html, nullptr, &html_start, &fragment_start, &fragment_end); + + DCHECK(fragment_start != std::string::npos && fragment_end != std::string::npos + && html_start != std::string::npos); + DCHECK(fragment_start >= html_start && fragment_end >= fragment_start); + + getUncommittedData()->setHtml(QString::fromStdString(cf_html.substr(html_start))); +#endif // !defined(Q_OS_WIN) } -void ClipboardQt::WriteRTF(const char *rtf_data, size_t data_len) +void ClipboardQt::WriteRTF(base::StringPiece rtf) { - getUncommittedData()->setData(QString::fromLatin1(ui::kMimeTypeRTF), QByteArray(rtf_data, data_len)); + getUncommittedData()->setData(QString::fromLatin1(ui::kMimeTypeRTF), toQByteArray(rtf)); } void ClipboardQt::WriteWebSmartPaste() @@ -169,12 +174,12 @@ void ClipboardQt::WriteBitmap(const SkBitmap &bitmap) getUncommittedData()->setImageData(toQImage(bitmap).copy()); } -void ClipboardQt::WriteBookmark(const char *title_data, size_t title_len, const char *url_data, size_t url_len) +void ClipboardQt::WriteBookmark(base::StringPiece title_in, base::StringPiece url_in) { // FIXME: Untested, seems to be used only for drag-n-drop. // Write as a mozilla url (UTF16: URL, newline, title). - QString url = QString::fromUtf8(url_data, url_len); - QString title = QString::fromUtf8(title_data, title_len); + QString url = toQString(url_in); + QString title = toQString(title_in); QByteArray data; data.append(reinterpret_cast<const char *>(url.utf16()), url.size() * 2); @@ -183,28 +188,37 @@ void ClipboardQt::WriteBookmark(const char *title_data, size_t title_len, const getUncommittedData()->setData(QString::fromLatin1(ui::kMimeTypeMozillaURL), data); } -void ClipboardQt::WriteData(const ui::ClipboardFormatType &format, const char *data_data, size_t data_len) +void ClipboardQt::WriteData(const ui::ClipboardFormatType &format, base::span<const uint8_t> data) { - getUncommittedData()->setData(QString::fromStdString(format.GetName()), QByteArray(data_data, data_len)); + getUncommittedData()->setData(QString::fromStdString(format.GetName()), QByteArray((const char *)data.data(), data.size())); } -bool ClipboardQt::IsFormatAvailable(const ui::ClipboardFormatType &format, ui::ClipboardBuffer type) const +bool ClipboardQt::IsFormatAvailable(const ui::ClipboardFormatType &format, + ui::ClipboardBuffer type, + const ui::DataTransferEndpoint *data_dst) const { const QMimeData *mimeData = QGuiApplication::clipboard()->mimeData( type == ui::ClipboardBuffer::kCopyPaste ? QClipboard::Clipboard : QClipboard::Selection); - return mimeData && mimeData->hasFormat(QString::fromStdString(format.GetName())); + + if (!mimeData) + return false; + if (format == ui::ClipboardFormatType::PngType()) + return mimeData->hasImage(); + return mimeData->hasFormat(QString::fromStdString(format.GetName())); } void ClipboardQt::Clear(ui::ClipboardBuffer type) { QGuiApplication::clipboard()->clear(type == ui::ClipboardBuffer::kCopyPaste ? QClipboard::Clipboard - : QClipboard::Selection); + : QClipboard::Selection); + m_dataSrc[type].reset(); } -void ClipboardQt::ReadAvailableTypes(ui::ClipboardBuffer type, std::vector<base::string16> *types, - bool *contains_filenames) const +void ClipboardQt::ReadAvailableTypes(ui::ClipboardBuffer type, + const ui::DataTransferEndpoint *data_dst, + std::vector<std::u16string> *types) const { - if (!types || !contains_filenames) { + if (!types) { NOTREACHED(); return; } @@ -214,18 +228,19 @@ void ClipboardQt::ReadAvailableTypes(ui::ClipboardBuffer type, std::vector<base: type == ui::ClipboardBuffer::kCopyPaste ? QClipboard::Clipboard : QClipboard::Selection); if (!mimeData) return; - if (mimeData->hasImage() && !mimeData->formats().contains(QStringLiteral("image/png"))) - types->push_back(toString16(QStringLiteral("image/png"))); - const QStringList formats = mimeData->formats(); - for (const QString &mimeType : formats) - types->push_back(toString16(mimeType)); - *contains_filenames = false; - const QByteArray customData = mimeData->data(QString::fromLatin1(ui::kMimeTypeWebCustomData)); - ui::ReadCustomDataTypes(customData.constData(), customData.size(), types); + for (const auto& mime_type : GetStandardFormats(type, data_dst)) + types->push_back(mime_type); + + if (mimeData->hasFormat(QString::fromLatin1(ui::kMimeTypeWebCustomData))) { + const QByteArray customData = mimeData->data(QString::fromLatin1(ui::kMimeTypeWebCustomData)); + ui::ReadCustomDataTypes(customData.constData(), customData.size(), types); + } } -void ClipboardQt::ReadText(ui::ClipboardBuffer type, base::string16 *result) const +void ClipboardQt::ReadText(ui::ClipboardBuffer type, + const ui::DataTransferEndpoint *data_dst, + std::u16string *result) const { const QMimeData *mimeData = QGuiApplication::clipboard()->mimeData( type == ui::ClipboardBuffer::kCopyPaste ? QClipboard::Clipboard : QClipboard::Selection); @@ -233,7 +248,9 @@ void ClipboardQt::ReadText(ui::ClipboardBuffer type, base::string16 *result) con *result = toString16(mimeData->text()); } -void ClipboardQt::ReadAsciiText(ui::ClipboardBuffer type, std::string *result) const +void ClipboardQt::ReadAsciiText(ui::ClipboardBuffer type, + const ui::DataTransferEndpoint *data_dst, + std::string *result) const { const QMimeData *mimeData = QGuiApplication::clipboard()->mimeData( type == ui::ClipboardBuffer::kCopyPaste ? QClipboard::Clipboard : QClipboard::Selection); @@ -241,7 +258,9 @@ void ClipboardQt::ReadAsciiText(ui::ClipboardBuffer type, std::string *result) c *result = mimeData->text().toStdString(); } -void ClipboardQt::ReadHTML(ui::ClipboardBuffer type, base::string16 *markup, std::string *src_url, +void ClipboardQt::ReadHTML(ui::ClipboardBuffer type, + const ui::DataTransferEndpoint *data_dst, + std::u16string *markup, std::string *src_url, uint32_t *fragment_start, uint32_t *fragment_end) const { markup->clear(); @@ -254,11 +273,40 @@ void ClipboardQt::ReadHTML(ui::ClipboardBuffer type, base::string16 *markup, std type == ui::ClipboardBuffer::kCopyPaste ? QClipboard::Clipboard : QClipboard::Selection); if (!mimeData) return; + +#if !defined(Q_OS_WIN) *markup = toString16(mimeData->html()); *fragment_end = static_cast<uint32_t>(markup->length()); +#else + const std::string cf_html = mimeData->html().toStdString(); + size_t html_start = std::string::npos; + size_t start_index = std::string::npos; + size_t end_index = std::string::npos; + CFHtmlExtractMetadata(cf_html, src_url, &html_start, &start_index, &end_index); + + // This might happen if the contents of the clipboard changed and CF_HTML is + // no longer available. + if (start_index == std::string::npos || end_index == std::string::npos + || html_start == std::string::npos) + return; + + if (start_index < html_start || end_index < start_index) + return; + + std::vector<size_t> offsets; + offsets.push_back(start_index - html_start); + offsets.push_back(end_index - html_start); + markup->assign(base::UTF8ToUTF16AndAdjustOffsets(cf_html.data() + html_start, &offsets)); + // Ensure the Fragment points within the string; see https://crbug.com/607181. + size_t end = std::min(offsets[1], markup->length()); + *fragment_start = base::checked_cast<uint32_t>(std::min(offsets[0], end)); + *fragment_end = base::checked_cast<uint32_t>(end); +#endif // !defined(Q_OS_WIN) } -void ClipboardQt::ReadRTF(ui::ClipboardBuffer type, std::string *result) const +void ClipboardQt::ReadRTF(ui::ClipboardBuffer type, + const ui::DataTransferEndpoint *data_dst, + std::string *result) const { const QMimeData *mimeData = QGuiApplication::clipboard()->mimeData( type == ui::ClipboardBuffer::kCopyPaste ? QClipboard::Clipboard : QClipboard::Selection); @@ -268,33 +316,26 @@ void ClipboardQt::ReadRTF(ui::ClipboardBuffer type, std::string *result) const *result = std::string(byteArray.constData(), byteArray.length()); } -void ClipboardQt::ReadImage(ui::ClipboardBuffer type, ReadImageCallback callback) const +void ClipboardQt::ReadPng(ui::ClipboardBuffer type, const ui::DataTransferEndpoint *, ui::Clipboard::ReadPngCallback callback) const { const QMimeData *mimeData = QGuiApplication::clipboard()->mimeData( type == ui::ClipboardBuffer::kCopyPaste ? QClipboard::Clipboard : QClipboard::Selection); if (!mimeData) - return std::move(callback).Run(SkBitmap()); + return std::move(callback).Run({}); QImage image = qvariant_cast<QImage>(mimeData->imageData()); - image = image.convertToFormat(QImage::Format_ARGB32); - SkBitmap bitmap; - - bitmap.allocN32Pixels(image.width(), image.height(), true); - const size_t bytesPerRowDst = bitmap.rowBytes(); - const size_t bytesPerLineSrc = static_cast<size_t>(image.bytesPerLine()); - const size_t dataBytes = std::min(bytesPerRowDst, bytesPerLineSrc); - uchar *dst = static_cast<uchar *>(bitmap.getPixels()); - const uchar *src = image.constBits(); - for (int y = 0; y < image.height(); ++y) { - memcpy(dst, src, dataBytes); - dst += bytesPerRowDst; - src += bytesPerLineSrc; - } - - return std::move(callback).Run(bitmap); + QBuffer buffer; + QImageWriter writer(&buffer, "png"); + writer.write(image); + std::vector<uint8_t> pngData; + pngData.resize(buffer.size()); + memcpy(pngData.data(), buffer.data().data(), buffer.size()); + return std::move(callback).Run(std::move(pngData)); } -void ClipboardQt::ReadCustomData(ui::ClipboardBuffer clipboard_type, const base::string16 &type, base::string16 *result) const +void ClipboardQt::ReadCustomData(ui::ClipboardBuffer clipboard_type, const std::u16string &type, + const ui::DataTransferEndpoint *data_dst, + std::u16string *result) const { const QMimeData *mimeData = QGuiApplication::clipboard()->mimeData( clipboard_type == ui::ClipboardBuffer::kCopyPaste ? QClipboard::Clipboard : QClipboard::Selection); @@ -304,12 +345,33 @@ void ClipboardQt::ReadCustomData(ui::ClipboardBuffer clipboard_type, const base: ui::ReadCustomDataForType(customData.constData(), customData.size(), type, result); } -void ClipboardQt::ReadBookmark(base::string16 *title, std::string *url) const +void ClipboardQt::ReadBookmark(const ui::DataTransferEndpoint *data_dst, std::u16string *title, std::string *url) const { NOTIMPLEMENTED(); } -void ClipboardQt::ReadData(const ui::ClipboardFormatType &format, std::string *result) const +void ClipboardQt::ReadSvg(ui::ClipboardBuffer clipboard_type, + const ui::DataTransferEndpoint *, + std::u16string *result) const +{ + const QMimeData *mimeData = QGuiApplication::clipboard()->mimeData( + clipboard_type == ui::ClipboardBuffer::kCopyPaste ? QClipboard::Clipboard : QClipboard::Selection); + if (!mimeData) + return; + const QByteArray svgData = mimeData->data(QString::fromLatin1(ui::kMimeTypeSvg)); + if (!svgData.isEmpty()) + *result = toString16(QString::fromUtf8(svgData)); +} + +void ClipboardQt::WriteSvg(base::StringPiece markup) +{ + getUncommittedData()->setData(QString::fromLatin1(ui::kMimeTypeSvg), + toQByteArray(markup)); +} + +void ClipboardQt::ReadData(const ui::ClipboardFormatType &format, + const ui::DataTransferEndpoint *data_dst, + std::string *result) const { const QMimeData *mimeData = QGuiApplication::clipboard()->mimeData(); if (!mimeData) @@ -318,25 +380,86 @@ void ClipboardQt::ReadData(const ui::ClipboardFormatType &format, std::string *r *result = std::string(byteArray.constData(), byteArray.length()); } -uint64_t ClipboardQt::GetSequenceNumber(ui::ClipboardBuffer type) const +const ui::ClipboardSequenceNumberToken &ClipboardQt::GetSequenceNumber(ui::ClipboardBuffer type) const { - return clipboardChangeObserver()->getSequenceNumber(type == ui::ClipboardBuffer::kCopyPaste ? QClipboard::Clipboard - : QClipboard::Selection); + return type == ui::ClipboardBuffer::kCopyPaste + ? clipboardChangeObserver()->getPrimarySequenceNumber() + : clipboardChangeObserver()->getSelectionSequenceNumber(); } -std::vector<base::string16> ClipboardQt::ReadAvailablePlatformSpecificFormatNames(ui::ClipboardBuffer buffer) const +const ui::DataTransferEndpoint *ClipboardQt::GetSource(ui::ClipboardBuffer buffer) const { - // based on ClipboardAura - std::vector<base::string16> types; - if (IsFormatAvailable(ui::ClipboardFormatType::GetPlainTextType(), buffer)) - types.push_back(base::UTF8ToUTF16(ui::ClipboardFormatType::GetPlainTextType().GetName())); - if (IsFormatAvailable(ui::ClipboardFormatType::GetHtmlType(), buffer)) - types.push_back(base::UTF8ToUTF16(ui::ClipboardFormatType::GetHtmlType().GetName())); - if (IsFormatAvailable(ui::ClipboardFormatType::GetRtfType(), buffer)) - types.push_back(base::UTF8ToUTF16(ui::ClipboardFormatType::GetRtfType().GetName())); - if (IsFormatAvailable(ui::ClipboardFormatType::GetBitmapType(), buffer)) - types.push_back(base::UTF8ToUTF16(ui::kMimeTypePNG)); + auto it = m_dataSrc.find(buffer); + return it == m_dataSrc.end() ? nullptr : it->second.get(); +} + +void ClipboardQt::ReadFilenames(ui::ClipboardBuffer buffer, + const ui::DataTransferEndpoint *data_dst, + std::vector<ui::FileInfo> *result) const +{ + const QMimeData *mimeData = QGuiApplication::clipboard()->mimeData( + buffer == ui::ClipboardBuffer::kCopyPaste ? QClipboard::Clipboard : QClipboard::Selection); + if (!mimeData) + return; + const QList<QUrl> urls = mimeData->urls(); + for (const QUrl &url : urls) { + if (url.isLocalFile()) { + base::FilePath filepath = toFilePath(url.toLocalFile()); + result->push_back(ui::FileInfo(filepath, base::FilePath())); + } + } +} + +void ClipboardQt::WriteFilenames(std::vector<ui::FileInfo> filenames) +{ + QList<QUrl> urls; + for (const ui::FileInfo &file : filenames) { + QUrl url = QUrl::fromLocalFile(QString::fromStdString(file.path.AsUTF8Unsafe())); + urls.append(url); + } + getUncommittedData()->setUrls(urls); +} +void ClipboardQt::WriteUnsanitizedHTML(base::StringPiece markup, absl::optional<base::StringPiece> source_url) +{ + WriteHTML(std::move(markup), std::move(source_url)); +} + +#if defined(USE_OZONE) +bool ClipboardQt::IsSelectionBufferAvailable() const +{ + return QGuiApplication::clipboard()->supportsSelection(); +} +#endif + +// This is the same as ReadAvailableTypes minus dealing with custom-data +std::vector<std::u16string> ClipboardQt::GetStandardFormats(ui::ClipboardBuffer buffer, const ui::DataTransferEndpoint *data_dst) const +{ + Q_UNUSED(data_dst); + const QMimeData *mimeData = QGuiApplication::clipboard()->mimeData( + buffer == ui::ClipboardBuffer::kCopyPaste ? QClipboard::Clipboard : QClipboard::Selection); + if (!mimeData) + return {}; + + std::vector<std::u16string> types; + if (mimeData->hasImage()) + types.push_back(base::UTF8ToUTF16(ui::kMimeTypePNG)); + if (mimeData->hasHtml()) + types.push_back(base::UTF8ToUTF16(ui::kMimeTypeHTML)); + if (mimeData->hasText()) + types.push_back(base::UTF8ToUTF16(ui::kMimeTypeText)); + if (mimeData->hasUrls()) + types.push_back(base::UTF8ToUTF16(ui::kMimeTypeURIList)); + const QStringList formats = mimeData->formats(); + for (const QString &mimeType : formats) { + auto mime_type = mimeType.toStdString(); + // Only add white-listed formats here + if (mime_type == ui::ClipboardFormatType::SvgType().GetName() || + mime_type == ui::ClipboardFormatType::RtfType().GetName()) { + types.push_back(base::UTF8ToUTF16(mime_type)); + continue; + } + } return types; } |