summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/core/web_contents_adapter.cpp36
-rw-r--r--src/core/web_contents_adapter.h2
-rw-r--r--src/core/web_contents_adapter_p.h2
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