File fix-opening-links.patch of Package messagelib.6886

From 1109b48ef544914353c87e1eb47cf08bafceeabc Mon Sep 17 00:00:00 2001
From: Montel Laurent <montel@kde.org>
Date: Thu, 27 Oct 2016 21:02:35 +0200
Subject: Fix Bug 368498 - Kmail does not open links with target="_blank"

FIXED-IN: 5.4.0
BUG: 368498
(cherry picked from commit 70173a8245c6f0401619f5be9cc4770451feeb21)
---
 webengineviewer/src/CMakeLists.txt                 |  2 +-
 .../src/webenginenavigationrequestinterceptor.cpp  | 47 ++++++++++++++++++++++
 .../src/webenginenavigationrequestinterceptor.h    | 43 ++++++++++++++++++++
 webengineviewer/src/webengineview.cpp              | 24 ++++++++++-
 4 files changed, 113 insertions(+), 3 deletions(-)
 create mode 100644 webengineviewer/src/webenginenavigationrequestinterceptor.cpp
 create mode 100644 webengineviewer/src/webenginenavigationrequestinterceptor.h

diff --git a/webengineviewer/src/CMakeLists.txt b/webengineviewer/src/CMakeLists.txt
index c626049..5a67248 100644
--- a/webengineviewer/src/CMakeLists.txt
+++ b/webengineviewer/src/CMakeLists.txt
@@ -48,9 +48,9 @@ set(libwebengineviewer_webengine_SRCS
     webenginescript.cpp
     webengineview.cpp
     webenginemanagescript.cpp
-
     webengineprintmessagebox.cpp
     webengineexporthtmlpagejob.cpp
+    webenginenavigationrequestinterceptor.cpp
     )
 
 set(libwebengineviewer_interceptor_SRCS
diff --git a/webengineviewer/src/webenginenavigationrequestinterceptor.cpp b/webengineviewer/src/webenginenavigationrequestinterceptor.cpp
new file mode 100644
index 0000000..f5d34cd
--- /dev/null
+++ b/webengineviewer/src/webenginenavigationrequestinterceptor.cpp
@@ -0,0 +1,47 @@
+/*
+   Copyright (C) 2016 Laurent Montel <montel@kde.org>
+
+   This library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public
+   License as published by the Free Software Foundation; either
+   version 2 of the License, or (at your option) any later version.
+
+   This library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public License
+   along with this library; see the file COPYING.LIB.  If not, write to
+   the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+   Boston, MA 02110-1301, USA.
+*/
+
+
+#include "webenginenavigationrequestinterceptor.h"
+#include "webenginepage.h"
+using namespace WebEngineViewer;
+
+WebEngineNavigationRequestInterceptor::WebEngineNavigationRequestInterceptor(QWebEnginePage *page)
+    : QWebEnginePage(page),
+      mTargetPage(page)
+{
+
+}
+
+WebEngineNavigationRequestInterceptor::~WebEngineNavigationRequestInterceptor()
+{
+
+}
+
+bool WebEngineNavigationRequestInterceptor::acceptNavigationRequest(const QUrl &url, QWebEnginePage::NavigationType type, bool isMainFrame)
+{
+    Q_UNUSED(isMainFrame);
+    WebEnginePage *page = qobject_cast<WebEnginePage *>(mTargetPage);
+    if (type == NavigationTypeLinkClicked && page) {
+        Q_EMIT page->urlClicked(url);
+        return false;
+    }
+    return false;
+}
+
diff --git a/webengineviewer/src/webenginenavigationrequestinterceptor.h b/webengineviewer/src/webenginenavigationrequestinterceptor.h
new file mode 100644
index 0000000..ad6e881
--- /dev/null
+++ b/webengineviewer/src/webenginenavigationrequestinterceptor.h
@@ -0,0 +1,43 @@
+/*
+   Copyright (C) 2016 Laurent Montel <montel@kde.org>
+
+   This library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public
+   License as published by the Free Software Foundation; either
+   version 2 of the License, or (at your option) any later version.
+
+   This library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public License
+   along with this library; see the file COPYING.LIB.  If not, write to
+   the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+   Boston, MA 02110-1301, USA.
+*/
+
+#ifndef WEBENGINENAVIGATIONREQUESTINTERCEPTOR_H
+#define WEBENGINENAVIGATIONREQUESTINTERCEPTOR_H
+
+#include <QWebEnginePage>
+
+namespace WebEngineViewer
+{
+class WebEnginePage;
+class WebEngineNavigationRequestInterceptor : public QWebEnginePage
+{
+    Q_OBJECT
+public:
+    explicit WebEngineNavigationRequestInterceptor(QWebEnginePage *page);
+    ~WebEngineNavigationRequestInterceptor();
+
+protected:
+    bool acceptNavigationRequest(const QUrl &url, NavigationType type, bool isMainFrame) Q_DECL_OVERRIDE;
+
+private:
+    QWebEnginePage *mTargetPage;
+};
+}
+
+#endif // WEBENGINENAVIGATIONREQUESTINTERCEPTOR_H
diff --git a/webengineviewer/src/webengineview.cpp b/webengineviewer/src/webengineview.cpp
index a976046..6193069 100644
--- a/webengineviewer/src/webengineview.cpp
+++ b/webengineviewer/src/webengineview.cpp
@@ -18,6 +18,7 @@
 */
 
 #include "webengineview.h"
+#include "webenginenavigationrequestinterceptor.h"
 #include "webenginemanagescript.h"
 #include "webengineviewer_debug.h"
 #include "../config-webengineviewer.h"
@@ -37,13 +38,26 @@ class WebEngineViewer::WebEngineViewPrivate
 public:
     WebEngineViewPrivate()
         : mSavedRelativePosition(-1),
-          mCurrentWidget(Q_NULLPTR)
+          mCurrentWidget(Q_NULLPTR),
+          mWebEngineNavigatorInterceptor(Q_NULLPTR),
+          mWebEngineNavigatorInterceptorView(Q_NULLPTR)
+
     {
 
     }
+    ~WebEngineViewPrivate()
+    {
+        delete mWebEngineNavigatorInterceptor;
+        mWebEngineNavigatorInterceptor = Q_NULLPTR;
+        delete mWebEngineNavigatorInterceptorView;
+        mWebEngineNavigatorInterceptorView = Q_NULLPTR;
+    }
+
     qreal mSavedRelativePosition;
     QWidget *mCurrentWidget;
     WebEngineManageScript *mManagerScript;
+    WebEngineNavigationRequestInterceptor *mWebEngineNavigatorInterceptor;
+    WebEngineView *mWebEngineNavigatorInterceptorView;
 };
 
 WebEngineView::WebEngineView(QWidget *parent)
@@ -193,7 +207,13 @@ bool WebEngineView::eventFilter(QObject *obj, QEvent *event)
 QWebEngineView *WebEngineView::createWindow(QWebEnginePage::WebWindowType type)
 {
     Q_UNUSED(type);
-    return Q_NULLPTR;
+    delete d->mWebEngineNavigatorInterceptor;
+    delete d->mWebEngineNavigatorInterceptorView;
+    d->mWebEngineNavigatorInterceptorView = new WebEngineView();
+
+    d->mWebEngineNavigatorInterceptor = new WebEngineNavigationRequestInterceptor(this->page());
+    d->mWebEngineNavigatorInterceptorView->setPage(d->mWebEngineNavigatorInterceptor);
+    return d->mWebEngineNavigatorInterceptorView;
 }
 
 void WebEngineView::clearRelativePosition()
-- 
cgit v0.11.2

openSUSE Build Service is sponsored by