diff options
-rw-r--r-- | src/core/clipboard_qt.cpp | 226 | ||||
-rw-r--r-- | src/core/clipboard_qt.h | 32 |
2 files changed, 145 insertions, 113 deletions
diff --git a/src/core/clipboard_qt.cpp b/src/core/clipboard_qt.cpp index 870c6ae2d..15d8e18dd 100644 --- a/src/core/clipboard_qt.cpp +++ b/src/core/clipboard_qt.cpp @@ -63,8 +63,6 @@ void ClipboardChangeObserver::trackChange(QClipboard::Mode mode) ++sequenceNumber[mode]; } -namespace ui { - namespace { const char kMimeTypeBitmap[] = "image/bmp"; @@ -83,6 +81,76 @@ QMimeData *getUncommittedData() } // namespace +namespace ui { + +// Factory function +Clipboard* Clipboard::Create() { + return new ClipboardQt; +} + +Clipboard::FormatType Clipboard::GetFormatType(const std::string& format_string) +{ + return FormatType::Deserialize(format_string); +} + +const Clipboard::FormatType& Clipboard::GetPlainTextFormatType() +{ + CR_DEFINE_STATIC_LOCAL(FormatType, type, (kMimeTypeText)); + return type; +} + +const Clipboard::FormatType& Clipboard::GetPlainTextWFormatType() +{ + return GetPlainTextFormatType(); +} + +const Clipboard::FormatType& Clipboard::GetUrlFormatType() +{ + return GetPlainTextFormatType(); +} + +const Clipboard::FormatType& Clipboard::GetUrlWFormatType() +{ + return GetPlainTextWFormatType(); +} + +const Clipboard::FormatType& Clipboard::GetHtmlFormatType() +{ + CR_DEFINE_STATIC_LOCAL(FormatType, type, (kMimeTypeHTML)); + return type; +} + +const Clipboard::FormatType& Clipboard::GetRtfFormatType() +{ + CR_DEFINE_STATIC_LOCAL(FormatType, type, (kMimeTypeRTF)); + return type; +} + +const Clipboard::FormatType& Clipboard::GetBitmapFormatType() +{ + CR_DEFINE_STATIC_LOCAL(FormatType, type, (kMimeTypeBitmap)); + return type; +} + +const Clipboard::FormatType& Clipboard::GetWebKitSmartPasteFormatType() +{ + CR_DEFINE_STATIC_LOCAL(FormatType, type, (kMimeTypeWebkitSmartPaste)); + return type; +} + +const Clipboard::FormatType& Clipboard::GetWebCustomDataFormatType() +{ + CR_DEFINE_STATIC_LOCAL(FormatType, type, (kMimeTypeWebCustomDataCopy)); + return type; +} + +const Clipboard::FormatType& Clipboard::GetPepperCustomDataFormatType() +{ + CR_DEFINE_STATIC_LOCAL(FormatType, type, (kMimeTypePepperCustomData)); + return type; +} + + Clipboard::FormatType::FormatType() { } @@ -111,15 +179,16 @@ bool Clipboard::FormatType::Equals(const FormatType& other) const return data_ == other.data_; } -Clipboard::Clipboard() +#if defined(OS_WIN) || defined(USE_AURA) +bool Clipboard::FormatType::operator<(const FormatType& other) const { + return data_.compare(other.data_) < 0; } +#endif -Clipboard::~Clipboard() -{ -} +} // namespace ui -void Clipboard::WriteObjects(ClipboardType type, const ObjectMap& objects) +void ClipboardQt::WriteObjects(ui::ClipboardType type, const ObjectMap& objects) { DCHECK(CalledOnValidThread()); DCHECK(IsSupportedClipboardType(type)); @@ -129,45 +198,45 @@ void Clipboard::WriteObjects(ClipboardType type, const ObjectMap& objects) // Commit the accumulated data. if (uncommittedData) - QGuiApplication::clipboard()->setMimeData(uncommittedData.take(), type == CLIPBOARD_TYPE_COPY_PASTE ? QClipboard::Clipboard : QClipboard::Selection); + QGuiApplication::clipboard()->setMimeData(uncommittedData.take(), type == ui::CLIPBOARD_TYPE_COPY_PASTE ? QClipboard::Clipboard : QClipboard::Selection); - if (type == CLIPBOARD_TYPE_COPY_PASTE) { + if (type == ui::CLIPBOARD_TYPE_COPY_PASTE) { ObjectMap::const_iterator text_iter = objects.find(CBF_TEXT); if (text_iter != objects.end()) { // Copy text and SourceTag to the selection clipboard. ObjectMap::const_iterator next_iter = text_iter; - WriteObjects(CLIPBOARD_TYPE_SELECTION, ObjectMap(text_iter, ++next_iter)); + WriteObjects(ui::CLIPBOARD_TYPE_SELECTION, ObjectMap(text_iter, ++next_iter)); } } } -void Clipboard::WriteText(const char* text_data, size_t text_len) +void ClipboardQt::WriteText(const char* text_data, size_t text_len) { getUncommittedData()->setText(QString::fromUtf8(text_data, text_len)); } -void Clipboard::WriteHTML(const char* markup_data, size_t markup_len, const char* url_data, size_t url_len) +void ClipboardQt::WriteHTML(const char* markup_data, size_t markup_len, const char* url_data, size_t url_len) { getUncommittedData()->setHtml(QString::fromUtf8(markup_data, markup_len)); } -void Clipboard::WriteRTF(const char* rtf_data, size_t data_len) +void ClipboardQt::WriteRTF(const char* rtf_data, size_t data_len) { getUncommittedData()->setData(QString::fromLatin1(kMimeTypeRTF), QByteArray(rtf_data, data_len)); } -void Clipboard::WriteWebSmartPaste() +void ClipboardQt::WriteWebSmartPaste() { getUncommittedData()->setData(QString::fromLatin1(kMimeTypeWebkitSmartPaste), QByteArray()); } -void Clipboard::WriteBitmap(const SkBitmap& bitmap) +void ClipboardQt::WriteBitmap(const SkBitmap& bitmap) { QImage image(reinterpret_cast<const uchar *>(bitmap.getPixels()), bitmap.width(), bitmap.height(), QImage::Format_ARGB32); getUncommittedData()->setImageData(image.copy()); } -void Clipboard::WriteBookmark(const char* title_data, size_t title_len, const char* url_data, size_t url_len) +void ClipboardQt::WriteBookmark(const char* title_data, size_t title_len, const char* url_data, size_t url_len) { // FIXME: Untested, seems to be used only for drag-n-drop. // Write as a mozilla url (UTF16: URL, newline, title). @@ -181,23 +250,23 @@ void Clipboard::WriteBookmark(const char* title_data, size_t title_len, const ch getUncommittedData()->setData(QString::fromLatin1(kMimeTypeMozillaURL), data); } -void Clipboard::WriteData(const FormatType& format, const char* data_data, size_t data_len) +void ClipboardQt::WriteData(const FormatType& format, const char* data_data, size_t data_len) { - getUncommittedData()->setData(QString::fromStdString(format.data_), QByteArray(data_data, data_len)); + getUncommittedData()->setData(QString::fromStdString(format.ToString()), QByteArray(data_data, data_len)); } -bool Clipboard::IsFormatAvailable(const Clipboard::FormatType& format, ClipboardType type) const +bool ClipboardQt::IsFormatAvailable(const ui::Clipboard::FormatType& format, ui::ClipboardType type) const { - const QMimeData *mimeData = QGuiApplication::clipboard()->mimeData(type == CLIPBOARD_TYPE_COPY_PASTE ? QClipboard::Clipboard : QClipboard::Selection); - return mimeData->hasFormat(QString::fromStdString(format.data_)); + const QMimeData *mimeData = QGuiApplication::clipboard()->mimeData(type == ui::CLIPBOARD_TYPE_COPY_PASTE ? QClipboard::Clipboard : QClipboard::Selection); + return mimeData->hasFormat(QString::fromStdString(format.ToString())); } -void Clipboard::Clear(ClipboardType type) +void ClipboardQt::Clear(ui::ClipboardType type) { - QGuiApplication::clipboard()->clear(type == CLIPBOARD_TYPE_COPY_PASTE ? QClipboard::Clipboard : QClipboard::Selection); + QGuiApplication::clipboard()->clear(type == ui::CLIPBOARD_TYPE_COPY_PASTE ? QClipboard::Clipboard : QClipboard::Selection); } -void Clipboard::ReadAvailableTypes(ui::ClipboardType type, std::vector<base::string16>* types, bool* contains_filenames) const +void ClipboardQt::ReadAvailableTypes(ui::ClipboardType type, std::vector<base::string16>* types, bool* contains_filenames) const { if (!types || !contains_filenames) { NOTREACHED(); @@ -205,29 +274,29 @@ void Clipboard::ReadAvailableTypes(ui::ClipboardType type, std::vector<base::str } types->clear(); - const QMimeData *mimeData = QGuiApplication::clipboard()->mimeData(type == CLIPBOARD_TYPE_COPY_PASTE ? QClipboard::Clipboard : QClipboard::Selection); + const QMimeData *mimeData = QGuiApplication::clipboard()->mimeData(type == ui::CLIPBOARD_TYPE_COPY_PASTE ? QClipboard::Clipboard : QClipboard::Selection); Q_FOREACH (const QString &mimeType, mimeData->formats()) types->push_back(toString16(mimeType)); *contains_filenames = false; const QByteArray customData = mimeData->data(QString::fromLatin1(kMimeTypeWebCustomDataCopy)); - ReadCustomDataTypes(customData.constData(), customData.size(), types); + ui::ReadCustomDataTypes(customData.constData(), customData.size(), types); } -void Clipboard::ReadText(ClipboardType type, base::string16* result) const +void ClipboardQt::ReadText(ui::ClipboardType type, base::string16* result) const { - const QMimeData *mimeData = QGuiApplication::clipboard()->mimeData(type == CLIPBOARD_TYPE_COPY_PASTE ? QClipboard::Clipboard : QClipboard::Selection); + const QMimeData *mimeData = QGuiApplication::clipboard()->mimeData(type == ui::CLIPBOARD_TYPE_COPY_PASTE ? QClipboard::Clipboard : QClipboard::Selection); *result = toString16(mimeData->text()); } -void Clipboard::ReadAsciiText(ClipboardType type, std::string* result) const +void ClipboardQt::ReadAsciiText(ui::ClipboardType type, std::string* result) const { - const QMimeData *mimeData = QGuiApplication::clipboard()->mimeData(type == CLIPBOARD_TYPE_COPY_PASTE ? QClipboard::Clipboard : QClipboard::Selection); + const QMimeData *mimeData = QGuiApplication::clipboard()->mimeData(type == ui::CLIPBOARD_TYPE_COPY_PASTE ? QClipboard::Clipboard : QClipboard::Selection); *result = mimeData->text().toStdString(); } -void Clipboard::ReadHTML(ClipboardType type, base::string16* markup, std::string* src_url, uint32* fragment_start, uint32* fragment_end) const +void ClipboardQt::ReadHTML(ui::ClipboardType type, base::string16* markup, std::string* src_url, uint32* fragment_start, uint32* fragment_end) const { markup->clear(); if (src_url) @@ -235,23 +304,23 @@ void Clipboard::ReadHTML(ClipboardType type, base::string16* markup, std::string *fragment_start = 0; *fragment_end = 0; - const QMimeData *mimeData = QGuiApplication::clipboard()->mimeData(type == CLIPBOARD_TYPE_COPY_PASTE ? QClipboard::Clipboard : QClipboard::Selection); + const QMimeData *mimeData = QGuiApplication::clipboard()->mimeData(type == ui::CLIPBOARD_TYPE_COPY_PASTE ? QClipboard::Clipboard : QClipboard::Selection); *markup = toString16(mimeData->html()); *fragment_end = static_cast<uint32>(markup->length()); } -void Clipboard::ReadRTF(ClipboardType type, std::string* result) const +void ClipboardQt::ReadRTF(ui::ClipboardType type, std::string* result) const { - const QMimeData *mimeData = QGuiApplication::clipboard()->mimeData(type == CLIPBOARD_TYPE_COPY_PASTE ? QClipboard::Clipboard : QClipboard::Selection); + const QMimeData *mimeData = QGuiApplication::clipboard()->mimeData(type == ui::CLIPBOARD_TYPE_COPY_PASTE ? QClipboard::Clipboard : QClipboard::Selection); const QByteArray byteArray = mimeData->data(QString::fromLatin1(kMimeTypeRTF)); *result = std::string(byteArray.constData(), byteArray.length()); } -SkBitmap Clipboard::ReadImage(ClipboardType type) const +SkBitmap ClipboardQt::ReadImage(ui::ClipboardType type) const { // FIXME: Untested, pasting image data seems to only be supported through // FileReader.readAsDataURL in JavaScript and this isn't working down the pipe for some reason. - const QMimeData *mimeData = QGuiApplication::clipboard()->mimeData(type == CLIPBOARD_TYPE_COPY_PASTE ? QClipboard::Clipboard : QClipboard::Selection); + const QMimeData *mimeData = QGuiApplication::clipboard()->mimeData(type == ui::CLIPBOARD_TYPE_COPY_PASTE ? QClipboard::Clipboard : QClipboard::Selection); QImage image = qvariant_cast<QImage>(mimeData->imageData()); Q_ASSERT(image.format() == QImage::Format_ARGB32); @@ -265,97 +334,28 @@ SkBitmap Clipboard::ReadImage(ClipboardType type) const return copy; } -void Clipboard::ReadCustomData(ClipboardType clipboard_type, const base::string16& type, base::string16* result) const +void ClipboardQt::ReadCustomData(ui::ClipboardType clipboard_type, const base::string16& type, base::string16* result) const { - const QMimeData *mimeData = QGuiApplication::clipboard()->mimeData(clipboard_type == CLIPBOARD_TYPE_COPY_PASTE ? QClipboard::Clipboard : QClipboard::Selection); + const QMimeData *mimeData = QGuiApplication::clipboard()->mimeData(clipboard_type == ui::CLIPBOARD_TYPE_COPY_PASTE ? QClipboard::Clipboard : QClipboard::Selection); const QByteArray customData = mimeData->data(QString::fromLatin1(kMimeTypeWebCustomDataCopy)); - ReadCustomDataForType(customData.constData(), customData.size(), type, result); + ui::ReadCustomDataForType(customData.constData(), customData.size(), type, result); } -void Clipboard::ReadBookmark(base::string16* title, std::string* url) const +void ClipboardQt::ReadBookmark(base::string16* title, std::string* url) const { NOTIMPLEMENTED(); } -void Clipboard::ReadData(const FormatType& format, std::string* result) const +void ClipboardQt::ReadData(const FormatType& format, std::string* result) const { const QMimeData *mimeData = QGuiApplication::clipboard()->mimeData(); - const QByteArray byteArray = mimeData->data(QString::fromStdString(format.data_)); + const QByteArray byteArray = mimeData->data(QString::fromStdString(format.ToString())); *result = std::string(byteArray.constData(), byteArray.length()); } -uint64 Clipboard::GetSequenceNumber(ClipboardType type) -{ - return clipboardChangeObserver()->getSequenceNumber(type == CLIPBOARD_TYPE_COPY_PASTE ? QClipboard::Clipboard : QClipboard::Selection); -} - -Clipboard::FormatType Clipboard::GetFormatType(const std::string& format_string) -{ - return FormatType::Deserialize(format_string); -} - -const Clipboard::FormatType& Clipboard::GetPlainTextFormatType() -{ - CR_DEFINE_STATIC_LOCAL(FormatType, type, (kMimeTypeText)); - return type; -} - -const Clipboard::FormatType& Clipboard::GetPlainTextWFormatType() -{ - return GetPlainTextFormatType(); -} - -const Clipboard::FormatType& Clipboard::GetUrlFormatType() -{ - return GetPlainTextFormatType(); -} - -const Clipboard::FormatType& Clipboard::GetUrlWFormatType() +uint64 ClipboardQt::GetSequenceNumber(ui::ClipboardType type) { - return GetPlainTextWFormatType(); + return clipboardChangeObserver()->getSequenceNumber(type == ui::CLIPBOARD_TYPE_COPY_PASTE ? QClipboard::Clipboard : QClipboard::Selection); } -const Clipboard::FormatType& Clipboard::GetHtmlFormatType() -{ - CR_DEFINE_STATIC_LOCAL(FormatType, type, (kMimeTypeHTML)); - return type; -} - -const Clipboard::FormatType& Clipboard::GetRtfFormatType() -{ - CR_DEFINE_STATIC_LOCAL(FormatType, type, (kMimeTypeRTF)); - return type; -} - -const Clipboard::FormatType& Clipboard::GetBitmapFormatType() -{ - CR_DEFINE_STATIC_LOCAL(FormatType, type, (kMimeTypeBitmap)); - return type; -} - -const Clipboard::FormatType& Clipboard::GetWebKitSmartPasteFormatType() -{ - CR_DEFINE_STATIC_LOCAL(FormatType, type, (kMimeTypeWebkitSmartPaste)); - return type; -} - -const Clipboard::FormatType& Clipboard::GetWebCustomDataFormatType() -{ - CR_DEFINE_STATIC_LOCAL(FormatType, type, (kMimeTypeWebCustomDataCopy)); - return type; -} - -const Clipboard::FormatType& Clipboard::GetPepperCustomDataFormatType() -{ - CR_DEFINE_STATIC_LOCAL(FormatType, type, (kMimeTypePepperCustomData)); - return type; -} - -#if defined(OS_WIN) || defined(USE_AURA) -bool Clipboard::FormatType::operator<(const FormatType& other) const -{ - return data_.compare(other.data_) < 0; -} -#endif -} // namespace ui diff --git a/src/core/clipboard_qt.h b/src/core/clipboard_qt.h index 87f2c2c2a..02db41c25 100644 --- a/src/core/clipboard_qt.h +++ b/src/core/clipboard_qt.h @@ -37,6 +37,8 @@ #ifndef CLIPBOARD_QT_H #define CLIPBOARD_QT_H +#include "ui/base/clipboard/clipboard.h" + #include <QClipboard> #include <QMap> #include <QObject> @@ -56,4 +58,34 @@ private: QMap<QClipboard::Mode, quint64> sequenceNumber; }; +class ClipboardQt : public ui::Clipboard { +public: + virtual uint64 GetSequenceNumber(ui::ClipboardType type) Q_DECL_OVERRIDE; + virtual bool IsFormatAvailable(const FormatType& format, ui::ClipboardType type) const Q_DECL_OVERRIDE; + virtual void Clear(ui::ClipboardType type) Q_DECL_OVERRIDE; + virtual void ReadAvailableTypes(ui::ClipboardType type, std::vector<base::string16>* types, bool* contains_filenames) const Q_DECL_OVERRIDE; + virtual void ReadText(ui::ClipboardType type, base::string16* result) const Q_DECL_OVERRIDE; + virtual void ReadAsciiText(ui::ClipboardType type, std::string* result) const Q_DECL_OVERRIDE; + virtual void ReadHTML(ui::ClipboardType type, + base::string16* markup, + std::string* src_url, + uint32* fragment_start, + uint32* fragment_end) const Q_DECL_OVERRIDE; + virtual void ReadRTF(ui::ClipboardType type, std::string* result) const Q_DECL_OVERRIDE; + virtual SkBitmap ReadImage(ui::ClipboardType type) const Q_DECL_OVERRIDE; + virtual void ReadCustomData(ui::ClipboardType clipboard_type, const base::string16& type, base::string16* result) const Q_DECL_OVERRIDE; + virtual void ReadBookmark(base::string16* title, std::string* url) const Q_DECL_OVERRIDE; + virtual void ReadData(const FormatType& format, std::string* result) const Q_DECL_OVERRIDE; + +protected: + virtual void WriteObjects(ui::ClipboardType type, const ObjectMap& objects) Q_DECL_OVERRIDE; + virtual void WriteText(const char* text_data, size_t text_len) Q_DECL_OVERRIDE; + virtual void WriteHTML(const char* markup_data, size_t markup_len, const char* url_data, size_t url_len) Q_DECL_OVERRIDE; + virtual void WriteRTF(const char* rtf_data, size_t data_len) Q_DECL_OVERRIDE; + virtual void WriteBookmark(const char* title_data, size_t title_len, const char* url_data, size_t url_len) Q_DECL_OVERRIDE; + virtual void WriteWebSmartPaste() Q_DECL_OVERRIDE; + virtual void WriteBitmap(const SkBitmap& bitmap) Q_DECL_OVERRIDE; + virtual void WriteData(const FormatType& format, const char* data_data, size_t data_len) Q_DECL_OVERRIDE; +}; + #endif |