diff options
-rw-r--r-- | src/core/web_contents_adapter.cpp | 36 | ||||
-rw-r--r-- | src/core/web_contents_adapter.h | 2 | ||||
-rw-r--r-- | src/core/web_contents_adapter_p.h | 2 |
3 files changed, 39 insertions, 1 deletions
diff --git a/src/core/web_contents_adapter.cpp b/src/core/web_contents_adapter.cpp index 8273b247f..9c78d67a0 100644 --- a/src/core/web_contents_adapter.cpp +++ b/src/core/web_contents_adapter.cpp @@ -93,6 +93,7 @@ #include <QVariant> #include <QtCore/qelapsedtimer.h> #include <QtCore/qmimedata.h> +#include <QtCore/qtemporarydir.h> #include <QtGui/qaccessible.h> #include <QtGui/qdrag.h> #include <QtGui/qpixmap.h> @@ -1206,7 +1207,11 @@ void WebContentsAdapter::startDragging(QObject *dragSource, const content::DropD #endif }); - drag->setMimeData(mimeDataFromDropData(*d->currentDropData)); + QMimeData *mimeData = mimeDataFromDropData(*d->currentDropData); + if (handleDropDataFileContents(dropData, mimeData)) + allowedActions = Qt::MoveAction; + + drag->setMimeData(mimeData); if (!pixmap.isNull()) { drag->setPixmap(pixmap); drag->setHotSpot(offset); @@ -1232,6 +1237,35 @@ void WebContentsAdapter::startDragging(QObject *dragSource, const content::DropD } } +bool WebContentsAdapter::handleDropDataFileContents(const content::DropData &dropData, + QMimeData *mimeData) +{ + if (dropData.file_contents.empty()) + return false; + + Q_D(WebContentsAdapter); + if (!d->dndTmpDir) { + d->dndTmpDir.reset(new QTemporaryDir); + if (!d->dndTmpDir->isValid()) { + d->dndTmpDir.reset(); + return false; + } + } + + const QString &fileName = toQt(dropData.file_description_filename); + const QString &filePath = d->dndTmpDir->filePath(fileName); + QFile file(filePath); + if (!file.open(QIODevice::WriteOnly)) { + qWarning("Cannot write temporary file %s.", qUtf8Printable(filePath)); + return false; + } + file.write(QByteArray::fromStdString(dropData.file_contents)); + + const QUrl &targetUrl = QUrl::fromLocalFile(filePath); + mimeData->setUrls(QList<QUrl>{targetUrl}); + return true; +} + static void fillDropDataFromMimeData(content::DropData *dropData, const QMimeData *mimeData) { Q_ASSERT(dropData->filenames.empty()); diff --git a/src/core/web_contents_adapter.h b/src/core/web_contents_adapter.h index 10c65a6cb..46c8d2604 100644 --- a/src/core/web_contents_adapter.h +++ b/src/core/web_contents_adapter.h @@ -58,6 +58,7 @@ QT_BEGIN_NAMESPACE class QAccessibleInterface; class QDragEnterEvent; class QDragMoveEvent; +class QMimeData; class QPageLayout; class QString; class QWebChannel; @@ -187,6 +188,7 @@ private: Q_DISABLE_COPY(WebContentsAdapter) Q_DECLARE_PRIVATE(WebContentsAdapter) void waitForUpdateDragActionCalled(); + bool handleDropDataFileContents(const content::DropData &dropData, QMimeData *mimeData); QScopedPointer<WebContentsAdapterPrivate> d_ptr; }; diff --git a/src/core/web_contents_adapter_p.h b/src/core/web_contents_adapter_p.h index f24070523..94f3ca08b 100644 --- a/src/core/web_contents_adapter_p.h +++ b/src/core/web_contents_adapter_p.h @@ -61,6 +61,7 @@ #include <QScopedPointer> #include <QSharedPointer> +QT_FORWARD_DECLARE_CLASS(QTemporaryDir) QT_FORWARD_DECLARE_CLASS(QWebChannel) class WebEngineContext; @@ -98,6 +99,7 @@ public: bool updateDragActionCalled; gfx::Point lastDragClientPos; gfx::Point lastDragScreenPos; + std::unique_ptr<QTemporaryDir> dndTmpDir; }; } // namespace QtWebEngineCore |