File fix-drag-and-drop-of-attachments.patch of Package messagelib.6886

From 42a5c00667e6440fcf3879a1dfdc9f31088f78d2 Mon Sep 17 00:00:00 2001
From: Montel Laurent <montel@kde.org>
Date: Tue, 8 Nov 2016 21:12:16 +0100
Subject: Fix Bug 366652 - Drag and drop attachments in Kmail has stopped
 working

Fix Bug 368378 - Regression in kMail 5.3.x: Drag and drop of attachments from a received mail into the composer does not work any more

FIXED-IN: 5.4.0
BUG: 366652
BUG: 368378
---
 messageviewer/src/viewer/viewer_p.cpp              | 46 +------------
 messageviewer/src/viewer/viewer_p.h                |  3 -
 .../src/viewer/webengine/mailwebengineview.cpp     | 77 +++++++++++++---------
 .../src/viewer/webengine/mailwebengineview.h       |  7 +-
 webengineviewer/src/webengineview.cpp              | 25 +------
 webengineviewer/src/webengineview.h                |  6 +-
 6 files changed, 52 insertions(+), 112 deletions(-)

diff --git a/messageviewer/src/viewer/viewer_p.cpp b/messageviewer/src/viewer/viewer_p.cpp
index 1865e70..906d061 100644
--- a/messageviewer/src/viewer/viewer_p.cpp
+++ b/messageviewer/src/viewer/viewer_p.cpp
@@ -1035,8 +1035,6 @@ void ViewerPrivate::showVCard(KMime::Content *msgPart)
 
 void ViewerPrivate::initHtmlWidget()
 {
-    mViewer->installEventFilter(this);
-
     if (!htmlWriter()) {
         mPartHtmlWriter = new WebEnginePartHtmlWriter(mViewer, 0);
 #ifdef MESSAGEVIEWER_READER_HTML_DEBUG
@@ -1062,47 +1060,6 @@ void ViewerPrivate::initHtmlWidget()
     connect(mViewer, &MailWebEngineView::pageIsScrolledToBottom, this, &ViewerPrivate::pageIsScrolledToBottom);
 }
 
-bool ViewerPrivate::eventFilter(QObject *, QEvent *e)
-{
-    if (e->type() == QEvent::MouseButtonPress) {
-        QMouseEvent *me = static_cast<QMouseEvent *>(e);
-        if (me->button() == Qt::LeftButton && (me->modifiers() & Qt::ShiftModifier)) {
-            // special processing for shift+click
-            URLHandlerManager::instance()->handleShiftClick(mHoveredUrl, this);
-            return true;
-        }
-        if (me->button() == Qt::LeftButton) {
-            mCanStartDrag = URLHandlerManager::instance()->willHandleDrag(mHoveredUrl, this);
-            mLastClickPosition = me->pos();
-        }
-    } else if (e->type() ==  QEvent::MouseButtonRelease) {
-        mCanStartDrag = false;
-    } else if (e->type() == QEvent::MouseMove) {
-        QMouseEvent *me = static_cast<QMouseEvent *>(e);
-
-        // First, update the hovered URL
-        mHoveredUrl = mViewer->linkOrImageUrlAt(me->globalPos());
-
-        // If we are potentially handling a drag, deal with that.
-        if (mCanStartDrag && me->buttons() & Qt::LeftButton) {
-
-            if ((mLastClickPosition - me->pos()).manhattanLength() > QApplication::startDragDistance()) {
-                if (URLHandlerManager::instance()->handleDrag(mHoveredUrl, this)) {
-
-                    // If the URL handler manager started a drag, don't handle this in the future
-                    mCanStartDrag = false;
-                }
-            }
-
-            // Don't tell WebKit about this mouse move event, or it might start its own drag!
-            return true;
-        }
-    }
-
-    // standard event processing
-    return false;
-}
-
 void ViewerPrivate::slotWheelZoomChanged(int numSteps)
 {
     if (mZoomActionMenu) {
@@ -1476,6 +1433,7 @@ void ViewerPrivate::createWidgets()
     readerBoxVBoxLayout->addWidget(mTextToSpeechWidget);
 
     mViewer = new MailWebEngineView(mActionCollection, readerBox);
+    mViewer->setViewer(this);
     readerBoxVBoxLayout->addWidget(mViewer);
     mViewer->setObjectName(QStringLiteral("mViewer"));
 
@@ -1957,7 +1915,6 @@ void ViewerPrivate::slotUrlOn(const QString &link)
     // The "link" we get here is not URL-encoded, and therefore there is no way QUrl could
     // parse it correctly. To workaround that, we use QWebFrame::hitTestContent() on the mouse position
     // to get the URL before WebKit managed to mangle it.
-    //TODO
     QUrl url(link);
     const QString protocol = url.scheme();
     if (protocol == QLatin1String("kmail") ||
@@ -1969,6 +1926,7 @@ void ViewerPrivate::slotUrlOn(const QString &link)
         mViewer->setAcceptDrops(true);
     }
 
+    mViewer->setLinkHovered(url);
     if (link.trimmed().isEmpty()) {
         KPIM::BroadcastStatus::instance()->reset();
         Q_EMIT showStatusBarMessage(QString());
diff --git a/messageviewer/src/viewer/viewer_p.h b/messageviewer/src/viewer/viewer_p.h
index 24a73a9..5978a9d 100644
--- a/messageviewer/src/viewer/viewer_p.h
+++ b/messageviewer/src/viewer/viewer_p.h
@@ -286,9 +286,6 @@ private:
     void initHtmlWidget();
     void createOpenWithMenu(QMenu *topMenu, const QString &contentTypeStr, bool fromCurrentContent);
 public:
-    /** Event filter */
-    bool eventFilter(QObject *obj, QEvent *ev) Q_DECL_OVERRIDE;
-
     /** Read settings from app's config file. */
     void readConfig();
 
diff --git a/messageviewer/src/viewer/webengine/mailwebengineview.cpp b/messageviewer/src/viewer/webengine/mailwebengineview.cpp
index a9054c1..df6fc91 100644
--- a/messageviewer/src/viewer/webengine/mailwebengineview.cpp
+++ b/messageviewer/src/viewer/webengine/mailwebengineview.cpp
@@ -22,6 +22,7 @@
 #include "webengineviewer/webenginescript.h"
 #include "mailwebenginescript.h"
 #include "messageviewer/messageviewersettings.h"
+#include "../urlhandlermanager.h"
 #include "loadexternalreferencesurlinterceptor/loadexternalreferencesurlinterceptor.h"
 #include "cidreferencesurlinterceptor/cidreferencesurlinterceptor.h"
 #include <WebEngineViewer/NetworkAccessManagerWebEngine>
@@ -65,15 +66,21 @@ public:
           mWebViewAccessKey(Q_NULLPTR),
           mExternalReference(Q_NULLPTR),
           mPageEngine(Q_NULLPTR),
-          mNetworkAccessManager(Q_NULLPTR)
+          mNetworkAccessManager(Q_NULLPTR),
+          mViewer(Q_NULLPTR),
+          mCanStartDrag(false)
     {
 
     }
+    QUrl mHoveredUrl;
+    QPoint mLastClickPosition;
     ScamDetectionWebEngine *mScamDetection;
     WebEngineViewer::WebEngineAccessKey *mWebViewAccessKey;
     MessageViewer::LoadExternalReferencesUrlInterceptor *mExternalReference;
     MailWebEnginePage *mPageEngine;
     WebEngineViewer::NetworkAccessManagerWebEngine *mNetworkAccessManager;
+    MessageViewer::ViewerPrivate *mViewer;
+    bool mCanStartDrag;
 };
 
 MailWebEngineView::MailWebEngineView(KActionCollection *ac, QWidget *parent)
@@ -108,6 +115,10 @@ MailWebEngineView::~MailWebEngineView()
     delete d;
 }
 
+void MailWebEngineView::setLinkHovered(const QUrl &url)
+{
+    d->mHoveredUrl = url;
+}
 
 void MailWebEngineView::runJavaScriptInWordId(const QString &script)
 {
@@ -118,6 +129,11 @@ void MailWebEngineView::runJavaScriptInWordId(const QString &script)
 #endif
 }
 
+void MailWebEngineView::setViewer(MessageViewer::ViewerPrivate *viewer)
+{
+    d->mViewer = viewer;
+}
+
 void MailWebEngineView::initializeScripts()
 {
     initializeJQueryScript();
@@ -177,20 +194,42 @@ void MailWebEngineView::forwardKeyReleaseEvent(QKeyEvent *e)
 
 void MailWebEngineView::forwardMousePressEvent(QMouseEvent *event)
 {
-    Q_UNUSED(event);
-    //qDebug()<<" void MailWebEngineView::forwardMousePressEvent(QMouseEvent *event)";
+    if (d->mViewer) {
+        if (event->button() == Qt::LeftButton && (event->modifiers() & Qt::ShiftModifier)) {
+            // special processing for shift+click
+
+            URLHandlerManager::instance()->handleShiftClick(d->mHoveredUrl, d->mViewer);
+            event->accept();
+            return;
+        }
+        if (event->button() == Qt::LeftButton) {
+            d->mCanStartDrag = URLHandlerManager::instance()->willHandleDrag(d->mHoveredUrl, d->mViewer);
+            d->mLastClickPosition = event->pos();
+        }
+    }
 }
 
 void MailWebEngineView::forwardMouseMoveEvent(QMouseEvent *event)
 {
-    Q_UNUSED(event);
-    //qDebug() << "void MailWebEngineView::forwardMouseMoveEvent(QMouseEvent *event)";
+    if (d->mViewer) {
+        // If we are potentially handling a drag, deal with that.
+        if (d->mCanStartDrag && event->buttons() & Qt::LeftButton) {
+
+            if ((d->mLastClickPosition - event->pos()).manhattanLength() > QApplication::startDragDistance()) {
+                if (URLHandlerManager::instance()->handleDrag(d->mHoveredUrl, d->mViewer)) {
+                    // If the URL handler manager started a drag, don't handle this in the future
+                    d->mCanStartDrag = false;
+                }
+            }
+            event->accept();
+        }
+    }
 }
 
 void MailWebEngineView::forwardMouseReleaseEvent(QMouseEvent *event)
 {
     Q_UNUSED(event);
-    //qDebug() << "void MailWebEngineView::forwardMouseReleaseEvent(QMouseEvent *event)";
+    d->mCanStartDrag = false;
 }
 
 void MailWebEngineView::forwardKeyPressEvent(QKeyEvent *e)
@@ -364,13 +402,6 @@ void MailWebEngineView::scrollToRelativePosition(qreal pos)
     runJavaScriptInWordId(WebEngineViewer::WebEngineScript::scrollToRelativePosition(pos));
 }
 
-QUrl MailWebEngineView::linkOrImageUrlAt(const QPoint &global) const
-{
-    Q_UNUSED(global);
-    //TODO
-    return {};
-}
-
 void MailWebEngineView::setAllowExternalContent(bool b)
 {
     if (d->mExternalReference->allowExternalContent() != b) {
@@ -389,22 +420,3 @@ void MailWebEngineView::slotLoadFinished()
     scamCheck();
 }
 
-void MailWebEngineView::dragEnterEvent(QDragEnterEvent *event)
-{
-    Q_UNUSED(event);
-    qDebug() << " void MailWebEngineView::dragEnterEvent(QDragEnterEvent *event)";
-}
-
-void MailWebEngineView::dragMoveEvent(QDragMoveEvent *e)
-{
-    qDebug() << " void MailWebEngineView::dragMoveEvent(QDragMoveEvent *e)";
-    WebEngineViewer::WebEngineView::dragMoveEvent(e);
-    //TODO
-}
-
-void MailWebEngineView::dropEvent(QDropEvent *e)
-{
-    Q_UNUSED(e);
-    qDebug() << " MailWebEngineView::dropEvent";
-}
-
diff --git a/messageviewer/src/viewer/webengine/mailwebengineview.h b/messageviewer/src/viewer/webengine/mailwebengineview.h
index 07f5cdc..babb573 100644
--- a/messageviewer/src/viewer/webengine/mailwebengineview.h
+++ b/messageviewer/src/viewer/webengine/mailwebengineview.h
@@ -29,6 +29,7 @@ class WebHitTestResult;
 }
 namespace MessageViewer
 {
+class ViewerPrivate;
 class MailWebEngineViewPrivate;
 class MESSAGEVIEWER_EXPORT MailWebEngineView : public WebEngineViewer::WebEngineView
 {
@@ -59,7 +60,6 @@ public:
     bool hasVerticalScrollBar() const;
     bool isAttachmentInjectionPoint(const QPoint &globalPos) const;
     void scrollToRelativePosition(qreal pos);
-    QUrl linkOrImageUrlAt(const QPoint &global) const;
 
     void setAllowExternalContent(bool b);
 
@@ -67,6 +67,8 @@ public:
     void toggleFullAddressList(const QString &field, const boost::function<QString()> &delayedHtml);
 
     void executeCustomRenderingScripts();
+    void setLinkHovered(const QUrl &url);
+    void setViewer(MessageViewer::ViewerPrivate *viewer);
 public Q_SLOTS:
     void slotZoomChanged(qreal zoom);
     void slotShowDetails();
@@ -82,9 +84,6 @@ protected:
     void resizeEvent(QResizeEvent *e) Q_DECL_OVERRIDE;
 
     void contextMenuEvent(QContextMenuEvent *e) Q_DECL_OVERRIDE;
-    void dragMoveEvent(QDragMoveEvent *e) Q_DECL_OVERRIDE;
-    void dragEnterEvent(QDragEnterEvent *event) Q_DECL_OVERRIDE;
-    void dropEvent(QDropEvent *e) Q_DECL_OVERRIDE;
 Q_SIGNALS:
     void wheelZoomChanged(int numSteps);
     void openUrl(const QUrl &url);
diff --git a/webengineviewer/src/webengineview.cpp b/webengineviewer/src/webengineview.cpp
index 96a8e5b..781513a 100644
--- a/webengineviewer/src/webengineview.cpp
+++ b/webengineviewer/src/webengineview.cpp
@@ -112,6 +112,7 @@ void WebEngineView::forwardKeyReleaseEvent(QKeyEvent *event)
 
 void WebEngineView::forwardMousePressEvent(QMouseEvent *event)
 {
+    qDebug()<<" void WebEngineView::forwardMousePressEvent(QMouseEvent *event)";
     Q_UNUSED(event);
 }
 
@@ -124,24 +125,6 @@ void WebEngineView::forwardMouseReleaseEvent(QMouseEvent *event)
     Q_UNUSED(event);
 }
 
-void WebEngineView::dragMoveEvent(QDragMoveEvent *e)
-{
-    Q_UNUSED(e);
-    qDebug() << " void WebEngineView::dragMoveEvent(QDragMoveEvent *e)";
-}
-
-void WebEngineView::dragEnterEvent(QDragEnterEvent *event)
-{
-    Q_UNUSED(event);
-    qDebug() << " void WebEngineView::dragEnterEvent(QDragEnterEvent *event)";
-}
-
-void WebEngineView::dropEvent(QDropEvent *e)
-{
-    Q_UNUSED(e);
-    qDebug() << " WebEngineView::dropEvent ";
-}
-
 bool WebEngineView::eventFilter(QObject *obj, QEvent *event)
 {
     // Hack to find widget that receives input events
diff --git a/webengineviewer/src/webengineview.h b/webengineviewer/src/webengineview.h
index 9e73b97..4d2380c 100644
--- a/webengineviewer/src/webengineview.h
+++ b/webengineviewer/src/webengineview.h
@@ -44,6 +44,7 @@ public:
     void initializeJQueryScript();
 
     WebEngineManageScript *webEngineManagerScript() const;
+    void setLinkHovered(const QUrl &url);
 
 protected:
     bool eventFilter(QObject *obj, QEvent *event) Q_DECL_OVERRIDE;
@@ -53,10 +54,6 @@ protected:
     virtual void forwardMousePressEvent(QMouseEvent *event);
     virtual void forwardMouseMoveEvent(QMouseEvent *event);
     virtual void forwardMouseReleaseEvent(QMouseEvent *event);
-
-    void dragMoveEvent(QDragMoveEvent *e) Q_DECL_OVERRIDE;
-    void dragEnterEvent(QDragEnterEvent *event) Q_DECL_OVERRIDE;
-    void dropEvent(QDropEvent *e) Q_DECL_OVERRIDE;

 private:
     WebEngineViewPrivate *const d;
-- 
cgit v0.11.2

openSUSE Build Service is sponsored by