File Add-QtWebEngine-support.patch of Package digikam

From 101b1170ef8484df732ccbff235dc28fc91f1a26 Mon Sep 17 00:00:00 2001
From: Maik Qualmann <metzpinguin@gmail.com>
Date: Wed, 28 Mar 2018 22:13:01 +0200
Subject: add possibility to use QWebEngine instead of QWebKit with compile
 flag CCBUGS: 363859

---
 bootstrap.linux                                    |   1 +
 bootstrap.macports                                 |   1 +
 core/CMakeLists.txt                                |  10 +-
 core/app/CMakeLists.txt                            |  34 +-
 core/app/utils/digikam_config.h.cmake.in           |   3 +
 core/app/views/stackedview.cpp                     |  11 +-
 core/app/views/welcomepageview.cpp                 |   8 +-
 core/app/views/welcomepageview_qwebengine.cpp      | 222 +++++++++++
 core/app/views/welcomepageview_qwebengine.h        |  87 +++++
 .../geolocation/geoiface/backend-googlemaps-js.js  |  12 +-
 core/libs/dialogs/CMakeLists.txt                   |  20 +-
 core/libs/dialogs/webbrowserdlg_qwebengine.cpp     | 228 ++++++++++++
 core/libs/dialogs/webbrowserdlg_qwebengine.h       |  76 ++++
 core/libs/widgets/mainview/dxmlguiwindow.cpp       |   7 +-
 .../htmlgallery/wizard/htmlfinalpage.cpp           |   8 +-
 core/utilities/geolocation/geoiface/CMakeLists.txt |  20 +-
 .../geoiface/backends/backendgooglemaps.cpp        |  29 +-
 .../geolocation/geoiface/widgets/htmlwidget.cpp    |   2 +-
 .../geolocation/geoiface/widgets/htmlwidget.h      |   2 +-
 .../geoiface/widgets/htmlwidget_qwebengine.cpp     | 409 +++++++++++++++++++++
 .../geoiface/widgets/htmlwidget_qwebengine.h       | 119 ++++++
 21 files changed, 1278 insertions(+), 31 deletions(-)
 create mode 100644 core/app/views/welcomepageview_qwebengine.cpp
 create mode 100644 core/app/views/welcomepageview_qwebengine.h
 create mode 100644 core/libs/dialogs/webbrowserdlg_qwebengine.cpp
 create mode 100644 core/libs/dialogs/webbrowserdlg_qwebengine.h
 create mode 100644 core/utilities/geolocation/geoiface/widgets/htmlwidget_qwebengine.cpp
 create mode 100644 core/utilities/geolocation/geoiface/widgets/htmlwidget_qwebengine.h

diff --git a/bootstrap.linux b/bootstrap.linux
index a877a31..5ecf3b8 100755
--- a/bootstrap.linux
+++ b/bootstrap.linux
@@ -91,6 +91,7 @@ $CMAKE_BINARY -G "$MAKEFILES_TYPE" . \
       -DENABLE_MEDIAPLAYER=ON \
       -DENABLE_DBUS=ON \
       -DENABLE_APPSTYLES=ON \
+      -DENABLE_QWEBENGINE=OFF \
       -Wno-dev \
       $SOURCEDIR && echo "$MESSAGE"
 
diff --git a/bootstrap.macports b/bootstrap.macports
index 41a331a..562552f 100755
--- a/bootstrap.macports
+++ b/bootstrap.macports
@@ -85,6 +85,7 @@ cmake -G "$MAKEFILES_TYPE" . \
       -DENABLE_KIO=OFF \
       -DENABLE_LEGACY=OFF \
       -DENABLE_APPSTYLES=OFF \
+      -DENABLE_QWEBENGINE=OFF \
       -DAPPLE_SUPPRESS_X11_WARNING=ON \
       -DCMAKE_COLOR_MAKEFILE=ON \
       -DCMAKE_BUILD_WITH_INSTALL_RPATH=ON \
diff --git a/core/CMakeLists.txt b/core/CMakeLists.txt
index 856954c..8f7163b 100644
--- a/core/CMakeLists.txt
+++ b/core/CMakeLists.txt
@@ -104,6 +104,7 @@ option(ENABLE_AKONADICONTACTSUPPORT "Build digiKam with KDE Mail Contacts suppor
 option(ENABLE_MEDIAPLAYER           "Build digiKam with Media Player support (default=OFF)"                              OFF)
 option(ENABLE_DBUS                  "Build digiKam with DBUS support (default=ON)"                                       ON)
 option(ENABLE_APPSTYLES             "Build digiKam with support for changing the widget application style (default=OFF)" OFF)
+option(ENABLE_QWEBENGINE            "Build digiKam with QWebEngine instead of QWebKit (default=OFF)"                     OFF)
 
 # Mysql support options (experimental):
 option(ENABLE_MYSQLSUPPORT          "Build digiKam with MySQL dabatase support (default=ON)"                             ON)
@@ -124,10 +125,15 @@ find_package(Qt5 ${QT_MIN_VERSION}
              Sql
              Xml
              PrintSupport
-             WebKitWidgets
              Network
 )
 
+if(ENABLE_QWEBENGINE)
+    find_package(Qt5 ${QT_MIN_VERSION} NO_MODULE COMPONENTS WebEngineWidgets)
+else()
+    find_package(Qt5 ${QT_MIN_VERSION} NO_MODULE COMPONENTS WebKitWidgets)
+endif()
+
 find_package(Qt5 ${QT_MIN_VERSION}
              OPTIONAL_COMPONENTS
              DBus
@@ -415,6 +421,7 @@ MACRO_BOOL_TO_01(ENABLE_INTERNALMYSQL    HAVE_INTERNALMYSQL)
 MACRO_BOOL_TO_01(ENABLE_MEDIAPLAYER      HAVE_MEDIAPLAYER)
 MACRO_BOOL_TO_01(ENABLE_DBUS             HAVE_DBUS)
 MACRO_BOOL_TO_01(ENABLE_APPSTYLES        HAVE_APPSTYLE_SUPPORT)
+MACRO_BOOL_TO_01(ENABLE_QWEBENGINE       HAVE_QWEBENGINE)
 
 # Whether to use Qt's scaling to downscale previews. Under MacOSX, Qt
 # can make use of the higher physical resolution of Retina
@@ -440,6 +447,7 @@ PRINT_COMPONENT_COMPILE_STATUS("MySQL Database Support" ENABLE_MYSQLSUPPORT)
 PRINT_COMPONENT_COMPILE_STATUS("MySQL Internal Support" ENABLE_INTERNALMYSQL)
 PRINT_COMPONENT_COMPILE_STATUS("DBUS Support"           ENABLE_DBUS)
 PRINT_COMPONENT_COMPILE_STATUS("App. Style Support"     ENABLE_APPSTYLES)
+PRINT_COMPONENT_COMPILE_STATUS("QWebEngine Support"     ENABLE_QWEBENGINE)
 
 # ==============================================================================
 
diff --git a/core/app/CMakeLists.txt b/core/app/CMakeLists.txt
index 23571bd..9b9be3c 100644
--- a/core/app/CMakeLists.txt
+++ b/core/app/CMakeLists.txt
@@ -93,7 +93,6 @@ endif()
 endif()
 
 include_directories($<TARGET_PROPERTY:Qt5::PrintSupport,INTERFACE_INCLUDE_DIRECTORIES>
-                    $<TARGET_PROPERTY:Qt5::WebKitWidgets,INTERFACE_INCLUDE_DIRECTORIES>
                     $<TARGET_PROPERTY:Qt5::Gui,INTERFACE_INCLUDE_DIRECTORIES>
                     $<TARGET_PROPERTY:Qt5::Xml,INTERFACE_INCLUDE_DIRECTORIES>
                     $<TARGET_PROPERTY:Qt5::Widgets,INTERFACE_INCLUDE_DIRECTORIES>
@@ -107,6 +106,12 @@ include_directories($<TARGET_PROPERTY:Qt5::PrintSupport,INTERFACE_INCLUDE_DIRECT
                     $<TARGET_PROPERTY:KF5::XmlGui,INTERFACE_INCLUDE_DIRECTORIES>
                     $<TARGET_PROPERTY:KF5::Service,INTERFACE_INCLUDE_DIRECTORIES>)
 
+if(ENABLE_QWEBENGINE)
+    include_directories($<TARGET_PROPERTY:Qt5::WebEngineWidgets,INTERFACE_INCLUDE_DIRECTORIES>)
+else()
+    include_directories($<TARGET_PROPERTY:Qt5::WebKitWidgets,INTERFACE_INCLUDE_DIRECTORIES>)
+endif()
+
 if(KF5KIO_FOUND)
     include_directories($<TARGET_PROPERTY:KF5::KIOWidgets,INTERFACE_INCLUDE_DIRECTORIES>)
 endif()
@@ -140,7 +145,6 @@ target_link_libraries(digikamcore
                       Qt5::Xml
                       Qt5::Widgets
                       Qt5::Sql
-                      Qt5::WebKitWidgets
                       Qt5::PrintSupport
                       Qt5::Concurrent
 
@@ -166,6 +170,12 @@ target_link_libraries(digikamcore
                       libraw
 )
 
+if(ENABLE_QWEBENGINE)
+    target_link_libraries(digikamcore PUBLIC Qt5::WebEngineWidgets)
+else()
+    target_link_libraries(digikamcore PUBLIC Qt5::WebKitWidgets)
+endif()
+
 if(ENABLE_DBUS)
     target_link_libraries(digikamcore PUBLIC Qt5::DBus)
 endif()
@@ -344,7 +354,6 @@ set(libdigikamgui_SRCS
 
     views/imagepreviewviewitem.cpp
     views/imagepreviewview.cpp
-    views/welcomepageview.cpp
     views/leftsidebarwidgets.cpp
     views/digikamview.cpp
     views/trashview.cpp
@@ -353,6 +362,18 @@ set(libdigikamgui_SRCS
     ${digikamadaptor_SRCS}
 )
 
+if(ENABLE_QWEBENGINE)
+    set(libdigikamgui_SRCS
+        ${libdigikamgui_SRCS}
+        views/welcomepageview_qwebengine.cpp
+       )
+else()
+    set(libdigikamgui_SRCS
+        ${libdigikamgui_SRCS}
+        views/welcomepageview.cpp
+       )
+endif()
+
 if(${Marble_FOUND})
     set(libdigikamgui_SRCS
         ${libdigikamgui_SRCS}
@@ -432,7 +453,6 @@ target_link_libraries(digikamgui
                       Qt5::Gui
                       Qt5::Widgets
                       Qt5::Sql
-                      Qt5::WebKitWidgets
                       Qt5::PrintSupport
 
                       KF5::Solid
@@ -443,6 +463,12 @@ target_link_libraries(digikamgui
                       ${OpenCV_LIBRARIES}
 )
 
+if(ENABLE_QWEBENGINE)
+    target_link_libraries(digikamgui PUBLIC Qt5::WebEngineWidgets)
+else()
+    target_link_libraries(digikamgui PUBLIC Qt5::WebKitWidgets)
+endif()
+
 if(ENABLE_DBUS)
     target_link_libraries(digikamgui PUBLIC Qt5::DBus)
 endif()
diff --git a/core/app/utils/digikam_config.h.cmake.in b/core/app/utils/digikam_config.h.cmake.in
index a4df21a..27046df 100644
--- a/core/app/utils/digikam_config.h.cmake.in
+++ b/core/app/utils/digikam_config.h.cmake.in
@@ -108,6 +108,9 @@
 /* Define to 1 if changing application styles is supported */
 #cmakedefine HAVE_APPSTYLE_SUPPORT 1
 
+/* Define to 1 if system use QWebEngine instead of QWebKit */
+#cmakedefine HAVE_QWEBENGINE 1
+
 #define LIBEXEC_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/${LIBEXEC_INSTALL_DIR}"
 
 /*
diff --git a/core/app/views/stackedview.cpp b/core/app/views/stackedview.cpp
index 554156a..4295b48 100644
--- a/core/app/views/stackedview.cpp
+++ b/core/app/views/stackedview.cpp
@@ -48,18 +48,23 @@
 #include "imagethumbnailbar.h"
 #include "loadingcacheinterface.h"
 #include "previewlayout.h"
-#include "welcomepageview.h"
 #include "thumbbardock.h"
 #include "tableview.h"
 #include "trashview.h"
 #include "dimg.h"
 
+#ifdef HAVE_QWEBENGINE
+#   include "welcomepageview_qwebengine.h"
+#else
+#   include "welcomepageview.h"
+#endif
+
 #ifdef HAVE_MEDIAPLAYER
-#include "mediaplayerview.h"
+#   include "mediaplayerview.h"
 #endif //HAVE_MEDIAPLAYER
 
 #ifdef HAVE_MARBLE
-#include "mapwidgetview.h"
+#   include "mapwidgetview.h"
 #endif // HAVE_MARBLE
 
 namespace Digikam
diff --git a/core/app/views/welcomepageview.cpp b/core/app/views/welcomepageview.cpp
index fee2172..a54bba6 100644
--- a/core/app/views/welcomepageview.cpp
+++ b/core/app/views/welcomepageview.cpp
@@ -41,11 +41,17 @@
 
 // Local includes
 
+#include "digikam_config.h"
 #include "digikam_debug.h"
 #include "digikam_version.h"
 #include "daboutdata.h"
 #include "thememanager.h"
-#include "webbrowserdlg.h"
+
+#ifdef HAVE_QWEBENGINE
+#   include "webbrowserdlg_qwebengine.h"
+#else
+#   include "webbrowserdlg.h"
+#endif
 
 namespace Digikam
 {
diff --git a/core/app/views/welcomepageview_qwebengine.cpp b/core/app/views/welcomepageview_qwebengine.cpp
new file mode 100644
index 0000000..ea964f8
--- /dev/null
+++ b/core/app/views/welcomepageview_qwebengine.cpp
@@ -0,0 +1,222 @@
+/* ============================================================
+ *
+ * This file is a part of digiKam project
+ * http://www.digikam.org
+ *
+ * Date        : 2006-12-20
+ * Description : a widget to display a welcome page
+ *               on root album.
+ *
+ * Copyright (C) 2006-2018 by Gilles Caulier <caulier dot gilles at gmail dot com>
+ * Copyright (C) 2009-2011 by Andi Clemens <andi dot clemens at gmail dot com>
+ * Copyright (C) 2015      by Mohamed Anwer <m dot anwer at gmx dot com>
+ *
+ * This program is free software; you can redistribute it
+ * and/or modify it under the terms of the GNU General
+ * Public License as published by the Free Software Foundation;
+ * either version 2, or (at your option)
+ * any later version.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * ============================================================ */
+
+#include "welcomepageview_qwebengine.h"
+
+// Qt includes
+
+#include <QFile>
+#include <QFileInfo>
+#include <QTimer>
+#include <QWidget>
+#include <QApplication>
+#include <QStandardPaths>
+
+// KDE includes
+
+#include <klocalizedstring.h>
+
+// Local includes
+
+#include "digikam_debug.h"
+#include "digikam_version.h"
+#include "daboutdata.h"
+#include "thememanager.h"
+#include "webbrowserdlg.h"
+
+namespace Digikam
+{
+
+WelcomePageViewPage::WelcomePageViewPage(QObject* const parent)
+    : QWebEnginePage(parent)
+{
+}
+
+WelcomePageViewPage::~WelcomePageViewPage()
+{
+}
+
+bool WelcomePageViewPage::acceptNavigationRequest(const QUrl& url, QWebEnginePage::NavigationType type, bool)
+{
+    if (type == QWebEnginePage::NavigationTypeLinkClicked)
+    {
+        emit linkClicked(url);
+        return false;
+    }
+
+    return true;
+}
+
+// ----------------------------------------------------------------------------
+
+WelcomePageView::WelcomePageView(QWidget* const parent)
+    : QWebEngineView(parent)
+{
+    setFocusPolicy(Qt::WheelFocus);
+    setContextMenuPolicy(Qt::NoContextMenu);
+
+    WelcomePageViewPage* const wpage = new WelcomePageViewPage(this);
+    setPage(wpage);
+
+    // ------------------------------------------------------------
+
+    connect(wpage, SIGNAL(linkClicked(const QUrl&)),
+            this, SLOT(slotUrlOpen(const QUrl&)));
+
+    connect(ThemeManager::instance(), SIGNAL(signalThemeChanged()),
+            this, SLOT(slotThemeChanged()));
+
+    QTimer::singleShot(0, this, SLOT(slotThemeChanged()));
+}
+
+WelcomePageView::~WelcomePageView()
+{
+}
+
+void WelcomePageView::slotUrlOpen(const QUrl& url)
+{
+    WebBrowserDlg* const browser = new WebBrowserDlg(url, this);
+    browser->show();
+}
+
+QStringList WelcomePageView::featuresTabContent() const
+{
+    QStringList newFeatures;
+    newFeatures << i18n("Port to Qt5 and KF5;");
+    newFeatures << i18n("Replacing digiKam KIOSlaves by a multi-threaded interface to query the database;");
+    newFeatures << i18n("Replacing Qt5::Multimedia dependency by QtAV framework to handle video files;");
+    newFeatures << i18n("Add embedded trash support for each collection instead desktop trash;");
+    newFeatures << i18n("Thumbs and preview video support is now delegate to QT5Multimedia framework;");
+    newFeatures << i18n("Mysql internal server is now configurable as Sqlite to store database files at a customized place;");
+    newFeatures << i18n("Mysql internal/remote server is now configurable with first run assistant;");
+    newFeatures << i18n("Add a new garbage collector tool to cleanup database;");
+    newFeatures << i18n("Add a new batch queue manager tool to convert RAW files to DNG;");
+    newFeatures << i18n("Add a new tool to export contents in html gallery;");
+    newFeatures << i18n("Add a new tool to export contents as a video slideshow;");
+    newFeatures << i18n("Add a new tool to export contents by email;");
+    newFeatures << i18n("Add a new batch queue manager tool to adjust time and date metadata;");
+    newFeatures << i18n("Add a new batch queue manager tool to detect and fix red-eyes automatically;");
+    newFeatures << i18n("Add a new option in editor and light table to import images from a digital scanner;");
+    newFeatures << i18n("Add a new option in editor and light table to edit metadata;");
+    newFeatures << i18n("Add a new option in editor and light table to edit geolocation;");
+    newFeatures << i18n("Add a new option in editor and light table to run presentation tool;");
+    newFeatures << i18n("Add a new editor tool to detect and fix red-eyes automatically;");
+    newFeatures << i18n("Add a new editor tool to perform color change based on Lut3D;");
+    newFeatures << i18n("Add a new tool in camera import interface to convert RAW files to DNG;");
+    newFeatures << i18n("Add a new tool to export items on local network through UPNP/DLNA;");
+    newFeatures << i18n("Consolidation of Mysql database backend;");
+    newFeatures << i18n("Improved startup time with differed scan for new items stage.");
+    newFeatures << i18n("Presentation and Slideshow tools now support video.");
+    // Add new features here...
+    newFeatures << i18n("...and much more.");
+
+    QString featureItems;
+
+    for (int i = 0 ; i < newFeatures.count() ; ++i)
+    {
+        featureItems += i18n("<li>%1</li>\n", newFeatures.at(i));
+    }
+
+    QString tabHeader = i18n("New Features");
+    QString tabContent =
+        i18n("<h3>%1</h3><ul>%2</ul>",
+             i18n("Some of the new features in this release of digiKam include (compared to digiKam 4.x):"),
+             featureItems
+            );
+
+    return QStringList() << tabHeader << tabContent;
+}
+
+QStringList WelcomePageView::aboutTabContent() const
+{
+    QString tabHeader = i18n("About");
+    QString tabContent =
+        i18n("<h3>%1</h3><h3>%2</h3><ul>%3</ul>",
+             i18n("digiKam is an open source photo management program designed to import, organize, enhance, search and export your digital images to and from your computer."),
+             i18n("Currently, you are in the Album view mode of digiKam. Albums are the places where your files are stored, and are identical to the folders on your hard disk."),
+             i18n("<li>%1</li><li>%2</li>",
+                  i18n("digiKam has many powerful features which are described in the <a href=\"https://docs.kde.org/trunk5/en/extragear-graphics/digikam/index.html\">documentation</a>"),
+                  i18n("The <a href=\"http://www.digikam.org\">digiKam homepage</a> provides information about new versions of digiKam."))
+            );
+    return QStringList() << tabHeader << tabContent;
+}
+
+QByteArray WelcomePageView::fileToString(const QString& aFileName) const
+{
+    QByteArray   result;
+    QFileInfo    info(aFileName);
+    unsigned int readLen;
+    unsigned int len = info.size();
+    QFile        file(aFileName);
+
+    if (aFileName.isEmpty() || len == 0     ||
+        !info.exists()      || info.isDir() || !info.isReadable() ||
+        !file.open(QIODevice::Unbuffered|QIODevice::ReadOnly))
+    {
+        return QByteArray();
+    }
+
+    result.resize(len + 2);
+    readLen = file.read(result.data(), len);
+
+    if (result[len-1] != '\n')
+    {
+        result[len++] = '\n';
+        ++readLen;
+    }
+
+    result[len] = '\0';
+
+    if (readLen < len)
+    {
+        return QByteArray();
+    }
+
+    return result;
+}
+
+void WelcomePageView::slotThemeChanged()
+{
+    QString appTitle         = i18n("digiKam");
+    QString slogan           = DAboutData::digiKamSlogan();
+    QString locationHtml     = QStandardPaths::locate(QStandardPaths::GenericDataLocation, QLatin1String("digikam/about/main.html"));
+
+    QString content = QString::fromUtf8(fileToString(locationHtml));
+    content         = content.arg(appTitle)
+                             .arg(slogan)
+                             .arg(i18n("Welcome to digiKam %1", QLatin1String(digikam_version)))
+                             .arg(featuresTabContent()[0])
+                             .arg(aboutTabContent()[0])
+                             .arg(i18n("Background Image Credits"))
+                             .arg(featuresTabContent()[1])
+                             .arg(aboutTabContent()[1]);
+
+    //qCDebug(DIGIKAM_GENERAL_LOG) << content;
+
+    setHtml(content, QUrl::fromLocalFile(locationHtml));
+}
+
+} // namespace Digikam
diff --git a/core/app/views/welcomepageview_qwebengine.h b/core/app/views/welcomepageview_qwebengine.h
new file mode 100644
index 0000000..97582e2
--- /dev/null
+++ b/core/app/views/welcomepageview_qwebengine.h
@@ -0,0 +1,87 @@
+/* ============================================================
+ *
+ * This file is a part of digiKam project
+ * http://www.digikam.org
+ *
+ * Date        : 2006-12-20
+ * Description : a widget to display a welcome page
+ *               on root album.
+ *
+ * Copyright (C) 2006-2018 by Gilles Caulier <caulier dot gilles at gmail dot com>
+ * Copyright (C) 2009-2011 by Andi Clemens <andi dot clemens at gmail dot com>
+ * Copyright (C) 2015      by Mohamed Anwer <m dot anwer at gmx dot com>
+ *
+ * This program is free software; you can redistribute it
+ * and/or modify it under the terms of the GNU General
+ * Public License as published by the Free Software Foundation;
+ * either version 2, or (at your option)
+ * any later version.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * ============================================================ */
+
+#ifndef WELCOME_PAGE_VIEW_QWEBENGINE_H
+#define WELCOME_PAGE_VIEW_QWEBENGINE_H
+
+// Qt includes
+
+#include <QString>
+#include <QByteArray>
+#include <QUrl>
+#include <QWebEngineView>
+#include <QWebEnginePage>
+
+// Local includes
+
+#include "digikam_export.h"
+
+namespace Digikam
+{
+
+class WelcomePageViewPage : public QWebEnginePage
+{
+    Q_OBJECT
+
+public:
+
+    explicit WelcomePageViewPage(QObject* const parent = 0);
+    virtual ~WelcomePageViewPage();
+
+    bool acceptNavigationRequest(const QUrl&, QWebEnginePage::NavigationType, bool);
+
+Q_SIGNALS:
+
+    void linkClicked(const QUrl&);
+
+};
+
+// -------------------------------------------------------------------
+
+class WelcomePageView : public QWebEngineView
+{
+    Q_OBJECT
+
+public:
+
+    explicit WelcomePageView(QWidget* const parent);
+    ~WelcomePageView();
+
+private:
+
+    QByteArray  fileToString(const QString& aFileName) const;
+    QStringList featuresTabContent() const;
+    QStringList aboutTabContent() const;
+
+private Q_SLOTS:
+
+    void slotUrlOpen(const QUrl&);
+    void slotThemeChanged();
+};
+
+} // namespace Digikam
+
+#endif // WELCOME_PAGE_VIEW_QWEBENGINE_H
diff --git a/core/data/geolocation/geoiface/backend-googlemaps-js.js b/core/data/geolocation/geoiface/backend-googlemaps-js.js
index 456586a..12d9151 100644
--- a/core/data/geolocation/geoiface/backend-googlemaps-js.js
+++ b/core/data/geolocation/geoiface/backend-googlemaps-js.js
@@ -47,10 +47,15 @@ var projectionHelper = null;
 
 function kgeomapPostEventString(eventString)
 {
+    // We keep these 2 lines for backwards compatibility with QWebView
     eventBuffer.push(eventString);
     window.status = '(event)';
+
+    // We use this when porting to QWebEngineView
+    console.log('(event)'+eventString);
 }
 
+// We keep this function for backwards compatibility with QWebView
 function kgeomapReadEventStrings()
 {
     var eventBufferString = eventBuffer.join('|');
@@ -759,9 +764,10 @@ function kgeomapInitialize()
     //       google.maps.event.addListener(map, 'bounds_changed', function() {
     //           kgeomapPostEventString('MB');
     //       });
-    //       google.maps.event.addListener(map, 'zoom_changed', function() {
-    //           kgeomapPostEventString('ZC');
-    //       });
+    google.maps.event.addListener(map, 'zoom_changed', function()
+        {
+            kgeomapPostEventString('ZC');
+        });
     google.maps.event.addListener(map, 'idle', function()
         {
             kgeomapPostEventString('id');
diff --git a/core/libs/dialogs/CMakeLists.txt b/core/libs/dialogs/CMakeLists.txt
index 5bba683..4b8c443 100644
--- a/core/libs/dialogs/CMakeLists.txt
+++ b/core/libs/dialogs/CMakeLists.txt
@@ -25,9 +25,20 @@ set(libdialogs_SRCS
     dconfigdlgwidgets.cpp
     dmessagebox.cpp
     dsplashscreen.cpp
-    webbrowserdlg.cpp
 )
 
+if(ENABLE_QWEBENGINE)
+    set(libdialogs_SRCS
+        ${libdialogs_SRCS}
+        webbrowserdlg_qwebengine.cpp
+       )
+else()
+    set(libdialogs_SRCS
+        ${libdialogs_SRCS}
+        webbrowserdlg.cpp
+       )
+endif()
+
 set(libdeletedialog_SRCS
     deletedialog.cpp
 )
@@ -41,13 +52,18 @@ include_directories(
     $<TARGET_PROPERTY:Qt5::Gui,INTERFACE_INCLUDE_DIRECTORIES>
     $<TARGET_PROPERTY:Qt5::Widgets,INTERFACE_INCLUDE_DIRECTORIES>
     $<TARGET_PROPERTY:Qt5::Core,INTERFACE_INCLUDE_DIRECTORIES>
-    $<TARGET_PROPERTY:Qt5::WebKitWidgets,INTERFACE_INCLUDE_DIRECTORIES>
 
     $<TARGET_PROPERTY:KF5::I18n,INTERFACE_INCLUDE_DIRECTORIES>
     $<TARGET_PROPERTY:KF5::XmlGui,INTERFACE_INCLUDE_DIRECTORIES>
     $<TARGET_PROPERTY:KF5::ConfigCore,INTERFACE_INCLUDE_DIRECTORIES>
 )
 
+if(ENABLE_QWEBENGINE)
+    include_directories($<TARGET_PROPERTY:Qt5::WebEngineWidgets,INTERFACE_INCLUDE_DIRECTORIES>)
+else()
+    include_directories($<TARGET_PROPERTY:Qt5::WebKitWidgets,INTERFACE_INCLUDE_DIRECTORIES>)
+endif()
+
 #used by digikamcore
 add_library(digikamdialogscore_src OBJECT ${libdialogs_SRCS})
 
diff --git a/core/libs/dialogs/webbrowserdlg_qwebengine.cpp b/core/libs/dialogs/webbrowserdlg_qwebengine.cpp
new file mode 100644
index 0000000..f1fc612
--- /dev/null
+++ b/core/libs/dialogs/webbrowserdlg_qwebengine.cpp
@@ -0,0 +1,228 @@
+/* ============================================================
+ *
+ * This file is a part of digiKam project
+ * http://www.digikam.org
+ *
+ * Date        : 2017-06-21
+ * Description : a simple web browser dialog based on Qt WebEngine.
+ *
+ * Copyright (C) 2017-2018 by Gilles Caulier <caulier dot gilles at gmail dot com>
+ *
+ * This program is free software; you can redistribute it
+ * and/or modify it under the terms of the GNU General
+ * Public License as published by the Free Software Foundation;
+ * either version 2, or (at your option)
+ * any later version.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * ============================================================ */
+
+#include "webbrowserdlg_qwebengine.h"
+
+// Qt includes
+
+#include <QGridLayout>
+#include <QApplication>
+#include <QStyle>
+#include <QIcon>
+#include <QWebEngineView>
+#include <QWebEnginePage>
+#include <QToolBar>
+#include <QDesktopServices>
+#include <QDebug>
+
+// KDE includes
+
+#include <klocalizedstring.h>
+#include <ksharedconfig.h>
+
+// Local includes
+
+#include "statusprogressbar.h"
+#include "searchtextbar.h"
+#include "dxmlguiwindow.h"
+
+namespace Digikam
+{
+
+class WebBrowserDlg::Private
+{
+public:
+
+    Private()
+    {
+        browser     = 0;
+        toolbar     = 0;
+        progressbar = 0;
+        searchbar   = 0;
+    }
+
+public:
+
+    QUrl               home;
+    QWebEngineView*    browser;
+    QToolBar*          toolbar;
+    StatusProgressBar* progressbar;
+    SearchTextBar*     searchbar;
+};
+
+WebBrowserDlg::WebBrowserDlg(const QUrl& url, QWidget* const parent)
+    : QDialog(parent),
+      d(new Private)
+{
+    setModal(false);
+    d->home    = url;
+    d->browser = new QWebEngineView(this);
+
+    // --------------------------
+
+    d->toolbar = new QToolBar(this);
+    d->toolbar->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
+    d->toolbar->addAction(d->browser->pageAction(QWebEnginePage::Back));
+    d->toolbar->addAction(d->browser->pageAction(QWebEnginePage::Forward));
+    d->toolbar->addAction(d->browser->pageAction(QWebEnginePage::Reload));
+    d->toolbar->addAction(d->browser->pageAction(QWebEnginePage::Stop));
+
+    QAction* const gohome  = new QAction(QIcon::fromTheme(QLatin1String("go-home")),
+                                         i18n("Home"), this);
+    gohome->setToolTip(i18n("Go back to Home page"));
+    d->toolbar->addAction(gohome);
+
+    QAction* const deskweb = new QAction(QIcon::fromTheme(QLatin1String("internet-web-browser")),
+                                         i18n("Desktop Browser"), this);
+    deskweb->setToolTip(i18n("Open Home page with default desktop Web browser"));
+    d->toolbar->addAction(deskweb);
+
+    // --------------------------
+
+    d->searchbar = new SearchTextBar(this, QLatin1String("WebBrowserDlgSearchBar"));
+    d->searchbar->setHighlightOnResult(true);
+
+    d->progressbar = new StatusProgressBar(this);
+    d->progressbar->setProgressTotalSteps(100);
+    d->progressbar->setAlignment(Qt::AlignLeft);
+    d->progressbar->setNotify(false);
+
+    // ----------------------
+
+    QGridLayout* const grid = new QGridLayout(this);
+    grid->setSpacing(QApplication::style()->pixelMetric(QStyle::PM_DefaultLayoutSpacing));
+    grid->addWidget(d->toolbar,     0, 0, 1, 1);
+    grid->addWidget(d->searchbar,   0, 2, 1, 1);
+    grid->addWidget(d->browser,     1, 0, 1, 3);
+    grid->addWidget(d->progressbar, 2, 0, 1, 3);
+    grid->setColumnStretch(1, 10);
+    grid->setRowStretch(1, 10);
+    setLayout(grid);
+
+    // ----------------------
+/*
+#if QT_VERSION >= 0x050700
+    connect(d->browser, SIGNAL(iconChanged(const QIcon&)),
+            this, SLOT(slotIconChanged(const QIcon&)));
+#endif
+*/
+    connect(d->browser, SIGNAL(titleChanged(const QString&)),
+            this, SLOT(slotTitleChanged(const QString&)));
+
+    connect(d->browser, SIGNAL(urlChanged(const QUrl&)),
+            this, SLOT(slotUrlChanged(const QUrl&)));
+
+    connect(d->browser, SIGNAL(loadStarted()),
+            this, SLOT(slotLoadingStarted()));
+
+    connect(d->browser, SIGNAL(loadFinished(bool)),
+            this, SLOT(slotLoadingFinished(bool)));
+
+    connect(d->searchbar, SIGNAL(signalSearchTextSettings(const SearchTextSettings&)),
+            this, SLOT(slotSearchTextChanged(const SearchTextSettings&)));
+
+    connect(d->browser, SIGNAL(loadProgress(int)),
+            d->progressbar, SLOT(setProgressValue(int)));
+
+    connect(gohome, SIGNAL(triggered()),
+            this, SLOT(slotGoHome()));
+
+    connect(deskweb, SIGNAL(triggered()),
+            this, SLOT(slotDesktopWebBrowser()));
+
+    // ----------------------
+
+    KConfigGroup group = KSharedConfig::openConfig()->group("WebBrowserDlg");
+
+    winId();
+    windowHandle()->resize(800, 600);
+    DXmlGuiWindow::restoreWindowSize(windowHandle(), group);
+    resize(windowHandle()->size());
+
+    slotGoHome();
+}
+
+WebBrowserDlg::~WebBrowserDlg()
+{
+    delete d;
+}
+
+void WebBrowserDlg::closeEvent(QCloseEvent* e)
+{
+    KConfigGroup group = KSharedConfig::openConfig()->group(QLatin1String("WebBrowserDlg"));
+    DXmlGuiWindow::saveWindowSize(windowHandle(), group);
+
+    e->accept();
+}
+
+void WebBrowserDlg::slotUrlChanged(const QUrl& url)
+{
+    d->progressbar->setText(url.toString());
+}
+
+void WebBrowserDlg::slotTitleChanged(const QString& title)
+{
+    setWindowTitle(title);
+}
+
+void WebBrowserDlg::slotIconChanged(const QIcon& icon)
+{
+    setWindowIcon(icon);
+}
+
+void WebBrowserDlg::slotLoadingStarted()
+{
+    d->progressbar->setProgressBarMode(StatusProgressBar::ProgressBarMode);
+}
+
+void WebBrowserDlg::slotLoadingFinished(bool b)
+{
+    QString curUrl = d->browser->url().toString();
+
+    d->progressbar->setProgressBarMode(StatusProgressBar::TextMode, curUrl);
+
+    if (!b)
+    {
+        d->progressbar->setText(i18n("Cannot load page %1", curUrl));
+    }
+}
+
+void WebBrowserDlg::slotSearchTextChanged(const SearchTextSettings& settings)
+{
+    d->browser->findText(settings.text,
+                         (settings.caseSensitive == Qt::CaseSensitive) ? QWebEnginePage::FindCaseSensitively 
+                                                                       : QWebEnginePage::FindFlags(),
+                         [this](bool found) { d->searchbar->slotSearchResult(found); });
+}
+
+void WebBrowserDlg::slotGoHome()
+{
+    d->browser->setUrl(d->home);
+}
+
+void WebBrowserDlg::slotDesktopWebBrowser()
+{
+    QDesktopServices::openUrl(d->home);
+}
+
+} // namespace Digikam
diff --git a/core/libs/dialogs/webbrowserdlg_qwebengine.h b/core/libs/dialogs/webbrowserdlg_qwebengine.h
new file mode 100644
index 0000000..30c15bf
--- /dev/null
+++ b/core/libs/dialogs/webbrowserdlg_qwebengine.h
@@ -0,0 +1,76 @@
+/* ============================================================
+ *
+ * This file is a part of digiKam project
+ * http://www.digikam.org
+ *
+ * Date        : 2017-06-21
+ * Description : a simple web browser dialog based on Qt WebEngine.
+ *
+ * Copyright (C) 2017-2018 by Gilles Caulier <caulier dot gilles at gmail dot com>
+ *
+ * This program is free software; you can redistribute it
+ * and/or modify it under the terms of the GNU General
+ * Public License as published by the Free Software Foundation;
+ * either version 2, or (at your option)
+ * any later version.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * ============================================================ */
+
+#ifndef WEB_BROWSER_DLG_QWEBENGINE_H
+#define WEB_BROWSER_DLG_QWEBENGINE_H
+
+// Qt include
+
+#include <QDialog>
+#include <QWidget>
+#include <QUrl>
+#include <QString>
+#include <QCloseEvent>
+
+// Local includes
+
+#include "digikam_export.h"
+
+namespace Digikam
+{
+
+class SearchTextSettings;
+
+class DIGIKAM_EXPORT WebBrowserDlg : public QDialog
+{
+    Q_OBJECT
+
+public:
+
+    explicit WebBrowserDlg(const QUrl& url, QWidget* const parent = 0);
+    ~WebBrowserDlg();
+
+private Q_SLOTS:
+
+    void slotUrlChanged(const QUrl&);
+    void slotLoadingStarted();
+    void slotLoadingFinished(bool);
+    void slotIconChanged(const QIcon&);
+    void slotTitleChanged(const QString&);
+    void slotSearchTextChanged(const SearchTextSettings&);
+    void slotGoHome();
+    void slotDesktopWebBrowser();
+
+protected:
+
+    void closeEvent(QCloseEvent*);
+
+private:
+
+    class Private;
+    Private* const d;
+};
+
+} // namespace Digikam
+
+#endif // WEB_BROWSER_DLG_QWEBENGINE_H
diff --git a/core/libs/widgets/mainview/dxmlguiwindow.cpp b/core/libs/widgets/mainview/dxmlguiwindow.cpp
index 86e8c53..75274c1 100644
--- a/core/libs/widgets/mainview/dxmlguiwindow.cpp
+++ b/core/libs/widgets/mainview/dxmlguiwindow.cpp
@@ -69,7 +69,12 @@
 #include "digikam_debug.h"
 #include "digikam_globals.h"
 #include "daboutdata.h"
-#include "webbrowserdlg.h"
+
+#ifdef HAVE_QWEBENGINE
+#   include "webbrowserdlg_qwebengine.h"
+#else
+#   include "webbrowserdlg.h"
+#endif
 
 namespace Digikam
 {
diff --git a/core/utilities/assistants/htmlgallery/wizard/htmlfinalpage.cpp b/core/utilities/assistants/htmlgallery/wizard/htmlfinalpage.cpp
index 7c9d01c..3de55e4 100644
--- a/core/utilities/assistants/htmlgallery/wizard/htmlfinalpage.cpp
+++ b/core/utilities/assistants/htmlgallery/wizard/htmlfinalpage.cpp
@@ -40,6 +40,7 @@
 
 // Local includes
 
+#include "digikam_config.h"
 #include "htmlwizard.h"
 #include "abstractthemeparameter.h"
 #include "galleryinfo.h"
@@ -48,7 +49,12 @@
 #include "digikam_debug.h"
 #include "dprogresswdg.h"
 #include "dhistoryview.h"
-#include "webbrowserdlg.h"
+
+#ifdef HAVE_QWEBENGINE
+#   include "webbrowserdlg_qwebengine.h"
+#else
+#   include "webbrowserdlg.h"
+#endif
 
 namespace Digikam
 {
diff --git a/core/utilities/geolocation/geoiface/CMakeLists.txt b/core/utilities/geolocation/geoiface/CMakeLists.txt
index 18fec7b..23c52a9 100644
--- a/core/utilities/geolocation/geoiface/CMakeLists.txt
+++ b/core/utilities/geolocation/geoiface/CMakeLists.txt
@@ -26,13 +26,23 @@ set(libgeoiface_SRCS backends/mapbackend.cpp
                      tiles/itemmarkertiler.cpp
                      tiles/tilegrouper.cpp
                      tiles/tileindex.cpp
-                     widgets/htmlwidget.cpp
                      widgets/mapwidget.cpp
                      widgets/placeholderwidget.cpp
 )
 
+if(ENABLE_QWEBENGINE)
+    set(libgeoiface_SRCS
+        ${libgeoiface_SRCS}
+        widgets/htmlwidget_qwebengine.cpp
+       )
+else()
+    set(libgeoiface_SRCS
+        ${libgeoiface_SRCS}
+        widgets/htmlwidget.cpp
+       )
+endif()
+
 include_directories($<TARGET_PROPERTY:Qt5::Xml,INTERFACE_INCLUDE_DIRECTORIES>
-                    $<TARGET_PROPERTY:Qt5::WebKitWidgets,INTERFACE_INCLUDE_DIRECTORIES>
                     $<TARGET_PROPERTY:Qt5::Network,INTERFACE_INCLUDE_DIRECTORIES>
                     $<TARGET_PROPERTY:Qt5::Gui,INTERFACE_INCLUDE_DIRECTORIES>
                     $<TARGET_PROPERTY:Qt5::Core,INTERFACE_INCLUDE_DIRECTORIES>
@@ -44,6 +54,12 @@ include_directories($<TARGET_PROPERTY:Qt5::Xml,INTERFACE_INCLUDE_DIRECTORIES>
                     ${MARBLE_INCLUDE_DIR}
 )
 
+if(ENABLE_QWEBENGINE)
+    include_directories($<TARGET_PROPERTY:Qt5::WebEngineWidgets,INTERFACE_INCLUDE_DIRECTORIES>)
+else()
+    include_directories($<TARGET_PROPERTY:Qt5::WebKitWidgets,INTERFACE_INCLUDE_DIRECTORIES>)
+endif()
+
 # Marble translations need explicit loading
 ecm_create_qm_loader(libgeoiface_SRCS marble_qt)
 
diff --git a/core/utilities/geolocation/geoiface/backends/backendgooglemaps.cpp b/core/utilities/geolocation/geoiface/backends/backendgooglemaps.cpp
index b242192..b2897cd 100644
--- a/core/utilities/geolocation/geoiface/backends/backendgooglemaps.cpp
+++ b/core/utilities/geolocation/geoiface/backends/backendgooglemaps.cpp
@@ -46,11 +46,17 @@
 
 // Local includes
 
-#include "htmlwidget.h"
+#include "digikam_config.h"
+#include "digikam_debug.h"
 #include "mapwidget.h"
 #include "abstractmarkertiler.h"
 #include "geomodelhelper.h"
-#include "digikam_debug.h"
+
+#ifdef HAVE_QWEBENGINE
+#   include "htmlwidget_qwebengine.h"
+#else
+#   include "htmlwidget.h"
+#endif
 
 namespace Digikam
 {
@@ -683,7 +689,7 @@ void BackendGoogleMaps::slotHTMLEvents(const QStringList& events)
 
     if (zoomProbablyChanged && !mapTypeChanged)
     {
-        d->cacheZoom = d->htmlWidget->runScript(QLatin1String("kgeomapGetZoom();")).toInt();
+        d->cacheZoom = d->htmlWidget->runScript(QLatin1String("kgeomapGetZoom();"), false).toInt();
         emit signalZoomChanged(QString::fromLatin1("googlemaps:%1").arg(d->cacheZoom));
     }
 
@@ -701,7 +707,7 @@ void BackendGoogleMaps::slotHTMLEvents(const QStringList& events)
 
     if (mapBoundsProbablyChanged)
     {
-        const QString mapBoundsString = d->htmlWidget->runScript(QLatin1String("kgeomapGetBounds();")).toString();
+        const QString mapBoundsString = d->htmlWidget->runScript(QLatin1String("kgeomapGetBounds();"), false).toString();
         GeoIfaceHelperParseBoundsString(mapBoundsString, &d->cacheBounds);
     }
 
@@ -764,11 +770,12 @@ bool BackendGoogleMaps::screenCoordinates(const GeoCoordinates& coordinates, QPo
     if (!d->isReady)
         return false;
 
-    const QString pointStringResult=d->htmlWidget->runScript(
+    const QString pointStringResult = d->htmlWidget->runScript(
                 QString::fromLatin1("kgeomapLatLngToPixel(%1, %2);")
                     .arg(coordinates.latString())
-                    .arg(coordinates.lonString())
-                    ).toString();
+                    .arg(coordinates.lonString()),
+                false
+                ).toString();
     const bool isValid = GeoIfaceHelperParseXYStringToPoint(
             pointStringResult,
             point);
@@ -994,8 +1001,8 @@ void BackendGoogleMaps::updateActionAvailability()
 void BackendGoogleMaps::updateZoomMinMaxCache()
 {
     // TODO: these functions seem to cause problems, the map is not fully updated after a few calls
-//     d->cacheMaxZoom = d->htmlWidget->runScript("kgeomapGetMaxZoom();").toInt();
-//     d->cacheMinZoom = d->htmlWidget->runScript("kgeomapGetMinZoom();").toInt();
+//     d->cacheMaxZoom = d->htmlWidget->runScript("kgeomapGetMaxZoom();", false).toInt();
+//     d->cacheMinZoom = d->htmlWidget->runScript("kgeomapGetMinZoom();", false).toInt();
 }
 
 void BackendGoogleMaps::slotThumbnailAvailableForIndex(const QVariant& index, const QPixmap& pixmap)
@@ -1328,7 +1335,7 @@ void BackendGoogleMaps::slotTracksChanged(const QList<TrackManager::TrackChanges
     if (!s->trackManager)
     {
         // no track manager, clear all tracks
-        const QVariant successClear = d->htmlWidget->runScript(QString::fromLatin1("kgeomapClearTracks();"));
+        const QVariant successClear = d->htmlWidget->runScript(QString::fromLatin1("kgeomapClearTracks();"), false);
 
         return;
     }
@@ -1424,7 +1431,7 @@ void BackendGoogleMaps::slotTrackVisibilityChanged(const bool newState)
     }
     else if (d->htmlWidget)
     {
-        const QVariant successClear = d->htmlWidget->runScript(QString::fromLatin1("kgeomapClearTracks();"));
+        const QVariant successClear = d->htmlWidget->runScript(QString::fromLatin1("kgeomapClearTracks();"), false);
     }
 }
 
diff --git a/core/utilities/geolocation/geoiface/widgets/htmlwidget.cpp b/core/utilities/geolocation/geoiface/widgets/htmlwidget.cpp
index 29d0906..3dac61e 100644
--- a/core/utilities/geolocation/geoiface/widgets/htmlwidget.cpp
+++ b/core/utilities/geolocation/geoiface/widgets/htmlwidget.cpp
@@ -255,7 +255,7 @@ void HTMLWidget::slotScanForJSMessages(const QString& message)
 /**
  * @brief Wrapper around executeScript to catch more errors
  */
-QVariant HTMLWidget::runScript(const QString& scriptCode)
+QVariant HTMLWidget::runScript(const QString& scriptCode, bool)
 {
     GEOIFACE_ASSERT(d->isReady);
 
diff --git a/core/utilities/geolocation/geoiface/widgets/htmlwidget.h b/core/utilities/geolocation/geoiface/widgets/htmlwidget.h
index 9a76ef9..f97b6a1 100644
--- a/core/utilities/geolocation/geoiface/widgets/htmlwidget.h
+++ b/core/utilities/geolocation/geoiface/widgets/htmlwidget.h
@@ -49,7 +49,7 @@ public:
     ~HTMLWidget();
 
     void loadInitialHTML(const QString& initialHTML);
-    QVariant runScript(const QString& scriptCode);
+    QVariant runScript(const QString& scriptCode, bool async = true);
     bool runScript2Coordinates(const QString& scriptCode, GeoCoordinates* const coordinates);
     void mouseModeChanged(const GeoMouseModes mouseMode);
     void setSelectionRectangle(const GeoCoordinates::Pair& searchCoordinates);
diff --git a/core/utilities/geolocation/geoiface/widgets/htmlwidget_qwebengine.cpp b/core/utilities/geolocation/geoiface/widgets/htmlwidget_qwebengine.cpp
new file mode 100644
index 0000000..0387245
--- /dev/null
+++ b/core/utilities/geolocation/geoiface/widgets/htmlwidget_qwebengine.cpp
@@ -0,0 +1,409 @@
+/* ============================================================
+ *
+ * This file is a part of digiKam project
+ * http://www.digikam.org
+ *
+ * Date        : 2009-12-01
+ * Description : Widget for displaying HTML in the backends
+ *
+ * Copyright (C) 2010-2018 by Gilles Caulier <caulier dot gilles at gmail dot com>
+ * Copyright (C) 2009-2011 by Michael G. Hansen <mike at mghansen dot de>
+ * Copyright (C) 2015      by Mohamed Anwer <mohammed dot ahmed dot anwer at gmail dot com>
+ *
+ * This program is free software; you can redistribute it
+ * and/or modify it under the terms of the GNU General
+ * Public License as published by the Free Software Foundation;
+ * either version 2, or (at your option)
+ * any later version.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * ============================================================ */
+
+#include "htmlwidget_qwebengine.h"
+
+// Qt includes
+
+#include <QEventLoop>
+#include <QResizeEvent>
+#include <QCoreApplication>
+#include <QWebEngineSettings>
+
+// Local includes
+
+#include "geoifacecommon.h"
+#include "geoifacetypes.h"
+#include "digikam_debug.h"
+
+namespace Digikam
+{
+
+HTMLWidgetPage::HTMLWidgetPage(HTMLWidget* const parent)
+    : QWebEnginePage(parent)
+{
+    m_timer = new QTimer(this);
+    m_timer->setInterval(100);
+    m_timer->setSingleShot(true);
+
+    connect(m_timer, SIGNAL(timeout()),
+            this, SLOT(slotSendHTMLEvents()),
+            Qt::QueuedConnection);
+}
+
+HTMLWidgetPage::~HTMLWidgetPage()
+{
+}
+
+void HTMLWidgetPage::javaScriptConsoleMessage(JavaScriptConsoleMessageLevel /*level*/, const QString& message, int /*lineNumber*/, const QString& /*sourceID*/)
+{
+    if (!message.startsWith(QLatin1String("(event)")))
+        return;
+
+    qCDebug(DIGIKAM_GEOIFACE_LOG) << message;
+
+    const QString eventString = message.mid(7);
+
+    if (eventString.isEmpty())
+        return;
+
+    m_events << eventString;
+
+    m_timer->start();
+}
+
+void HTMLWidgetPage::slotSendHTMLEvents()
+{
+    emit signalHTMLEvents(m_events);
+    m_events.clear();
+}
+
+// ---------------------------------------------------------------------------------------------
+
+class HTMLWidget::Private
+{
+public:
+
+    Private()
+      : parent(0),
+        child(0),
+        hpage(0),
+        isReady(false),
+        selectionStatus(false),
+        firstSelectionPoint(),
+        intermediateSelectionPoint(),
+        firstSelectionScreenPoint(),
+        intermediateSelectionScreenPoint()
+    {
+    }
+
+    QWidget*        parent;
+    QWidget*        child;
+    HTMLWidgetPage* hpage;
+
+    bool            isReady;
+    bool            selectionStatus;
+
+    GeoCoordinates  firstSelectionPoint;
+    GeoCoordinates  intermediateSelectionPoint;
+
+    QPoint          firstSelectionScreenPoint;
+    QPoint          intermediateSelectionScreenPoint;
+};
+
+HTMLWidget::HTMLWidget(QWidget* const parent)
+    : QWebEngineView(parent),
+      d(new Private()),
+      s(0)
+{
+    d->parent = parent;
+    setAcceptDrops(false);
+    setFocusPolicy(Qt::WheelFocus);
+    // settings()->setAttribute(QWebEngineSettings::WebGLEnabled, false);
+
+    d->hpage = new HTMLWidgetPage(this);
+    setPage(d->hpage);
+
+    d->parent->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
+
+    connect(this, SIGNAL(loadProgress(int)),
+            this, SLOT(progress(int)));
+
+    connect(this, SIGNAL(loadFinished(bool)),
+            this, SLOT(slotHTMLCompleted(bool)));
+
+    connect(d->hpage, SIGNAL(signalHTMLEvents(QStringList)),
+            this, SIGNAL(signalHTMLEvents(QStringList)));
+
+    if (d->parent)
+    {
+        d->parent->installEventFilter(this);
+    }
+
+    d->child = findChild<QWidget*>();
+
+    if (d->child)
+    {
+        d->child->installEventFilter(this);
+    }
+}
+
+HTMLWidget::~HTMLWidget()
+{
+    delete d;
+}
+
+void HTMLWidget::progress(int progress)
+{
+    qCDebug(DIGIKAM_GEOIFACE_LOG) << "Maps Loading Progress: " << progress << "%";
+}
+
+void HTMLWidget::slotHTMLCompleted(bool ok)
+{
+    qCDebug(DIGIKAM_GEOIFACE_LOG) << "Map Loading Completed: " << ok;
+    d->isReady = ok;
+
+    emit signalJavaScriptReady();
+}
+
+/**
+ * @brief Wrapper around executeScript to catch more errors
+ */
+QVariant HTMLWidget::runScript(const QString& scriptCode, bool async)
+{
+    GEOIFACE_ASSERT(d->isReady);
+
+    if (!d->isReady)
+        return QVariant();
+
+    //qCDebug(DIGIKAM_GEOIFACE_LOG) << scriptCode;
+
+    if(async)
+    {
+        page()->runJavaScript(scriptCode);
+    }
+    else
+    {
+        QVariant ret;
+        QEventLoop loop;
+        // lambda c11 function capturing value returned by java script code which is not synchro with QWebEngineView.
+        // See https://wiki.qt.io/Porting_from_QtWebKit_to_QtWebEngine.
+        page()->runJavaScript(scriptCode, [&ret, &loop](const QVariant& result){ ret.setValue(result); loop.quit(); });
+
+        loop.exec();
+
+        return ret;
+    }
+    
+    return true;
+}
+
+/**
+ * @brief Execute a script which returns coordinates and parse these
+ */
+bool HTMLWidget::runScript2Coordinates(const QString& scriptCode, GeoCoordinates* const coordinates)
+{
+    const QVariant scriptResult = runScript(scriptCode, false);
+
+    return GeoIfaceHelperParseLatLonString(scriptResult.toString(), coordinates);
+}
+
+bool HTMLWidget::eventFilter(QObject* object, QEvent* event)
+{
+    if (d->parent && object == d->parent)
+    {
+
+        if (event->type() == QEvent::Resize)
+        {
+            QResizeEvent* const resizeEvent = dynamic_cast<QResizeEvent*>(event);
+
+            if (resizeEvent)
+            {
+                resize(resizeEvent->size());
+            }
+        }
+    }
+    else if (d->child && object == d->child)
+    {
+        if (event->type() == QEvent::MouseButtonRelease)
+        {
+            QMouseEvent* const e = dynamic_cast<QMouseEvent*>(event);
+
+            if (s->currentMouseMode == MouseModeRegionSelection)
+            {
+                if (!d->firstSelectionPoint.hasCoordinates())
+                {
+                    runScript2Coordinates(QString::fromLatin1("kgeomapPixelToLatLng(%1, %2);")
+                                          .arg(e->x())
+                                          .arg(e->y()),
+                                          &d->firstSelectionPoint);
+
+                    d->firstSelectionScreenPoint = QPoint(e->x(), e->y());
+                }
+                else
+                {
+                    runScript2Coordinates(QString::fromLatin1("kgeomapPixelToLatLng(%1, %2);")
+                                          .arg(e->x())
+                                          .arg(e->y()),
+                                          &d->intermediateSelectionPoint);
+
+                    d->intermediateSelectionScreenPoint = QPoint(e->x(), e->y());
+
+                    qreal lonWest, latNorth, lonEast, latSouth;
+
+                    if (d->firstSelectionScreenPoint.x() < d->intermediateSelectionScreenPoint.x())
+                    {
+                        lonWest  = d->firstSelectionPoint.lon();
+                        lonEast  = d->intermediateSelectionPoint.lon();
+                    }
+                    else
+                    {
+                        lonEast  = d->firstSelectionPoint.lon();
+                        lonWest  = d->intermediateSelectionPoint.lon();
+                    }
+
+                    if (d->firstSelectionScreenPoint.y() < d->intermediateSelectionScreenPoint.y())
+                    {
+                        latNorth = d->firstSelectionPoint.lat();
+                        latSouth = d->intermediateSelectionPoint.lat();
+                    }
+                    else
+                    {
+                        latNorth = d->intermediateSelectionPoint.lat();
+                        latSouth = d->firstSelectionPoint.lat();
+                    }
+
+                    runScript(QLatin1String("kgeomapRemoveTemporarySelectionRectangle();"));
+                    runScript(QString::fromLatin1("kgeomapSetSelectionRectangle(%1, %2, %3, %4);")
+                                .arg(lonWest)
+                                .arg(latNorth)
+                                .arg(lonEast)
+                                .arg(latSouth));
+
+                    const GeoCoordinates::Pair selectionCoordinates(
+                            GeoCoordinates(latNorth, lonWest),
+                            GeoCoordinates(latSouth, lonEast));
+
+                    d->firstSelectionPoint.clear();
+                    d->intermediateSelectionPoint.clear();
+
+                    emit selectionHasBeenMade(selectionCoordinates);
+                }
+            }
+        }
+        else if (event->type() == QEvent::MouseMove)
+        {
+            QMouseEvent* const e = dynamic_cast<QMouseEvent*>(event);
+
+            if (s->currentMouseMode == MouseModeRegionSelection &&
+                d->firstSelectionPoint.hasCoordinates())
+            {
+                runScript2Coordinates(QString::fromLatin1("kgeomapPixelToLatLng(%1, %2);")
+                                      .arg(e->x())
+                                      .arg(e->y()),
+                                      &d->intermediateSelectionPoint);
+
+                d->intermediateSelectionScreenPoint = QPoint(e->x(), e->y());
+
+                qCDebug(DIGIKAM_GEOIFACE_LOG) << d->firstSelectionScreenPoint << QLatin1String(" ") << d->intermediateSelectionScreenPoint;
+
+                qreal lonWest, latNorth, lonEast, latSouth;
+
+                if (d->firstSelectionScreenPoint.x() < d->intermediateSelectionScreenPoint.x())
+                {
+                    lonWest  = d->firstSelectionPoint.lon();
+                    lonEast  = d->intermediateSelectionPoint.lon();
+                }
+                else
+                {
+                    lonEast  = d->firstSelectionPoint.lon();
+                    lonWest  = d->intermediateSelectionPoint.lon();
+                }
+
+                if (d->firstSelectionScreenPoint.y() < d->intermediateSelectionScreenPoint.y())
+                {
+                    latNorth = d->firstSelectionPoint.lat();
+                    latSouth = d->intermediateSelectionPoint.lat();
+                }
+                else
+                {
+                    latNorth = d->intermediateSelectionPoint.lat();
+                    latSouth = d->firstSelectionPoint.lat();
+                }
+
+                runScript(QString::fromLatin1("kgeomapSetTemporarySelectionRectangle(%1, %2, %3, %4);")
+                            .arg(lonWest)
+                            .arg(latNorth)
+                            .arg(lonEast)
+                            .arg(latSouth));
+            }
+        }
+    }
+
+    return false;
+}
+
+void HTMLWidget::setSelectionRectangle(const GeoCoordinates::Pair& searchCoordinates)
+{
+    if (!searchCoordinates.first.hasCoordinates())
+    {
+        runScript(QString::fromLatin1("kgeomapRemoveSelectionRectangle();"));
+        return;
+    }
+
+    qreal West  = searchCoordinates.first.lon();
+    qreal North = searchCoordinates.first.lat();
+    qreal East  = searchCoordinates.second.lon();
+    qreal South = searchCoordinates.second.lat();
+
+    runScript(QString::fromLatin1("kgeomapSetSelectionRectangle(%1, %2, %3, %4);")
+                .arg(West).arg(North).arg(East).arg(South));
+}
+
+void HTMLWidget::removeSelectionRectangle()
+{
+    runScript(QLatin1String("kgeomapRemoveSelectionRectangle();"));
+}
+
+void HTMLWidget::mouseModeChanged(const GeoMouseModes mouseMode)
+{
+    const bool inSelectionMode = (mouseMode == MouseModeRegionSelection);
+
+    if (inSelectionMode)
+    {
+        d->firstSelectionPoint.clear();
+        d->intermediateSelectionPoint.clear();
+        runScript(QString::fromLatin1("kgeomapSelectionModeStatus(%1);").arg(inSelectionMode));
+    }
+    else
+    {
+        runScript(QString::fromLatin1("kgeomapSelectionModeStatus(%1);").arg(inSelectionMode));
+    }
+}
+
+void HTMLWidget::centerOn(const qreal west, const qreal north,
+                          const qreal east, const qreal south,
+                          const bool useSaneZoomLevel)
+{
+/*
+    qCDebug(DIGIKAM_GEOIFACE_LOG) << "West:" << west
+                                  << " North:" << north
+                                  << " East:" << east
+                                  << " South:" << south;
+*/
+    runScript(QString::fromLatin1("kgeomapSetMapBoundaries(%1, %2, %3, %4, %5);")
+                .arg(west)
+                .arg(north)
+                .arg(east)
+                .arg(south)
+                .arg(useSaneZoomLevel ? 1 : 0));
+}
+
+void HTMLWidget::setSharedGeoIfaceObject(GeoIfaceSharedData* const sharedData)
+{
+    s = sharedData;
+}
+
+} // namespace Digikam
diff --git a/core/utilities/geolocation/geoiface/widgets/htmlwidget_qwebengine.h b/core/utilities/geolocation/geoiface/widgets/htmlwidget_qwebengine.h
new file mode 100644
index 0000000..14cebb3
--- /dev/null
+++ b/core/utilities/geolocation/geoiface/widgets/htmlwidget_qwebengine.h
@@ -0,0 +1,119 @@
+/* ============================================================
+ *
+ * This file is a part of digiKam project
+ * http://www.digikam.org
+ *
+ * Date        : 2009-12-01
+ * Description : Widget for displaying HTML in the backends
+ *
+ * Copyright (C) 2010-2018 by Gilles Caulier <caulier dot gilles at gmail dot com>
+ * Copyright (C) 2009-2011 by Michael G. Hansen <mike at mghansen dot de>
+ * Copyright (C) 2015      by Mohamed Anwer <mohammed dot ahmed dot anwer at gmail dot com>
+ *
+ * This program is free software; you can redistribute it
+ * and/or modify it under the terms of the GNU General
+ * Public License as published by the Free Software Foundation;
+ * either version 2, or (at your option)
+ * any later version.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * ============================================================ */
+
+#ifndef HTML_WIDGET_QWEBENGINE_H
+#define HTML_WIDGET_QWEBENGINE_H
+
+// Qt includes
+
+#include <QTimer>
+#include <QWebEngineView>
+#include <QWebEnginePage>
+
+// Local includes
+
+#include "geoifacecommon.h"
+#include "geoifacetypes.h"
+#include "geocoordinates.h"
+
+namespace Digikam
+{
+
+class HTMLWidget;
+
+class HTMLWidgetPage : public QWebEnginePage
+{
+    Q_OBJECT
+
+public:
+
+    explicit HTMLWidgetPage(HTMLWidget* const parent = 0);
+    virtual ~HTMLWidgetPage();
+
+Q_SIGNALS:
+
+    void signalHTMLEvents(const QStringList& events);
+
+private Q_SLOTS:
+
+    void slotSendHTMLEvents();
+
+protected:
+
+    void javaScriptConsoleMessage(JavaScriptConsoleMessageLevel, const QString&, int, const QString&);
+
+private:
+
+    QStringList m_events;
+    QTimer*     m_timer;
+};
+
+// -------------------------------------------------------------------
+
+class HTMLWidget : public QWebEngineView
+{
+    Q_OBJECT
+
+public:
+
+    explicit HTMLWidget(QWidget* const parent = 0);
+    ~HTMLWidget();
+
+    void loadInitialHTML(const QString& initialHTML);
+    QVariant runScript(const QString& scriptCode, bool async = true);
+    bool runScript2Coordinates(const QString& scriptCode, GeoCoordinates* const coordinates);
+    void mouseModeChanged(const GeoMouseModes mouseMode);
+    void setSelectionRectangle(const GeoCoordinates::Pair& searchCoordinates);
+    void removeSelectionRectangle();
+    void centerOn(const qreal west, const qreal north, const qreal east, const qreal south,
+                  const bool useSaneZoomLevel = true);
+    void setSharedGeoIfaceObject(GeoIfaceSharedData* const sharedData);
+
+Q_SIGNALS:
+
+    void signalHTMLEvents(const QStringList& events);
+    void signalJavaScriptReady();
+    void selectionHasBeenMade(const Digikam::GeoCoordinates::Pair& coordinatesRect);
+
+protected:
+
+    bool eventFilter(QObject*, QEvent*);
+
+protected Q_SLOTS:
+
+    void slotHTMLCompleted(bool ok);
+    void progress(int progress);
+
+private:
+
+    class Private;
+    Private* const d;
+
+    GeoIfaceSharedData* s;
+};
+
+} // namespace Digikam
+
+#endif // HTML_WIDGET_QWEBENGINE_H
-- 
cgit v0.11.2

openSUSE Build Service is sponsored by