diff --git a/CMakeLists.txt b/CMakeLists.txt --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -33,7 +33,7 @@ include(KDECMakeSettings) set(QT_MIN_VERSION "5.4.0") -find_package(Qt5 ${QT_MIN_VERSION} CONFIG REQUIRED Widgets Concurrent Quick QuickWidgets WebKitWidgets Test) +find_package(Qt5 ${QT_MIN_VERSION} CONFIG REQUIRED Widgets Concurrent Quick QuickWidgets WebEngineWidgets Test) set(KF5_DEP_VERSION "5.15.0") # we need KCrash::initialize find_package(KF5 ${KF5_DEP_VERSION} REQUIRED COMPONENTS Config diff --git a/documentation/manpage/manpagedocumentation.cpp b/documentation/manpage/manpagedocumentation.cpp --- a/documentation/manpage/manpagedocumentation.cpp +++ b/documentation/manpage/manpagedocumentation.cpp @@ -26,6 +26,7 @@ #include #include #include +#include #include "manpagedocumentation.h" #include "manpageplugin.h" @@ -38,6 +39,22 @@ ManPagePlugin* ManPageDocumentation::s_provider=nullptr; +class PageInterceptor : public QWebEnginePage +{ +public: + PageInterceptor(KDevelop::StandardDocumentationView* parent) : QWebEnginePage(parent), m_view(parent) {} + + bool acceptNavigationRequest(const QUrl &url, NavigationType type, bool /*isMainFrame*/) override { + qDebug() << "navigating to..." << url << type; + if (type == NavigationTypeLinkClicked) { + m_view->linkClicked(url); + return false; + } + return true; + } + + KDevelop::StandardDocumentationView* m_view; +}; ManPageDocumentation::ManPageDocumentation(const QString& name, const QUrl& url) : m_url(url), m_name(name) @@ -71,15 +88,22 @@ QWidget* ManPageDocumentation::documentationWidget(KDevelop::DocumentationFindWidget* findWidget, QWidget* parent ) { KDevelop::StandardDocumentationView* view = new KDevelop::StandardDocumentationView(findWidget, parent); + view->setPage(new PageInterceptor(view)); view->setDocumentation(IDocumentation::Ptr(this)); // apply custom style-sheet to normalize look of the page const QString cssFile = QStandardPaths::locate(QStandardPaths::GenericDataLocation, "kdevmanpage/manpagedocumentation.css"); - QWebSettings* settings = view->settings(); - settings->setUserStyleSheetUrl(QUrl::fromLocalFile(cssFile)); + view->page()->runJavaScript( + "var link = document.createElement( 'link' );" + "link.href = " + cssFile.toUtf8() + ";" + "link.type = 'text/css';" + "link.rel = 'stylesheet';" + "link.media = 'screen,print';" + "document.getElementsByTagName( 'head' )[0].appendChild( link );" + ); - view->page()->setLinkDelegationPolicy(QWebPage::DelegateAllLinks); QObject::connect(view, &KDevelop::StandardDocumentationView::linkClicked, ManPageDocumentation::s_provider->model(), &ManPageModel::showItemFromUrl); + return view; } diff --git a/documentation/qthelp/qthelpdocumentation.h b/documentation/qthelp/qthelpdocumentation.h --- a/documentation/qthelp/qthelpdocumentation.h +++ b/documentation/qthelp/qthelpdocumentation.h @@ -30,7 +30,7 @@ class QModelIndex; class QNetworkAccessManager; -class QWebView; +class QWebEngineView; class QtHelpProviderAbstract; class QTemporaryFile; @@ -61,15 +61,15 @@ void jumpedTo(const QUrl& newUrl); private: - void setUserStyleSheet(QWebView* view, const QUrl& url); + void setUserStyleSheet(QWebEngineView* view, const QUrl& url); private: QtHelpProviderAbstract *m_provider; const QString m_name; const QMap m_info; const QMap::const_iterator m_current; - QWebView* lastView; + QWebEngineView* lastView; QPointer m_lastStyleSheet; QScopedPointer m_sharedQNAM; }; diff --git a/documentation/qthelp/qthelpdocumentation.cpp b/documentation/qthelp/qthelpdocumentation.cpp --- a/documentation/qthelp/qthelpdocumentation.cpp +++ b/documentation/qthelp/qthelpdocumentation.cpp @@ -29,6 +29,11 @@ #include #include #include +#include +#include +#include +#include +#include #include @@ -98,11 +103,28 @@ } +class QtHelpSchemeHandler : public QWebEngineUrlSchemeHandler +{ +public: + explicit QtHelpSchemeHandler(QNetworkAccessManager* nam, QObject *parent = 0) : m_nam(nam) {} + + void requestStarted(QWebEngineUrlRequestJob *job) override { + const QUrl url = job->requestUrl(); + + auto reply = m_nam->get(QNetworkRequest(url)); + job->reply("text/html", reply); + } + +private: + QNetworkAccessManager* m_nam; +}; + QtHelpProviderAbstract* QtHelpDocumentation::s_provider=nullptr; QtHelpDocumentation::QtHelpDocumentation(const QString& name, const QMap& info) : m_provider(s_provider), m_name(name), m_info(info), m_current(info.constBegin()), lastView(nullptr) -{} +{ +} QtHelpDocumentation::QtHelpDocumentation(const QString& name, const QMap& info, const QString& key) : m_provider(s_provider), m_name(name), m_info(info), m_current(m_info.find(key)), lastView(nullptr) @@ -115,6 +137,7 @@ QString QtHelpDocumentation::description() const { QUrl url(m_current.value()); + qDebug() << "xxxxxxxxxxx" << url; QByteArray data = m_provider->engine()->fileData(url); //Extract a short description from the html data @@ -224,7 +247,7 @@ return QStringList(m_info.keys()).join(", "); } -void QtHelpDocumentation::setUserStyleSheet(QWebView* view, const QUrl& url) +void QtHelpDocumentation::setUserStyleSheet(QWebEngineView* view, const QUrl& url) { QTemporaryFile* file = new QTemporaryFile(view); @@ -237,7 +260,7 @@ << "#qtdocheader .qtref { position: absolute !important; top: 5px !important; right: 0 !important; }\n"; } file->close(); - view->settings()->setUserStyleSheetUrl(QUrl::fromLocalFile(file->fileName())); +// view->settings()->setUserStyleSheetUrl(QUrl::fromLocalFile(file->fileName())); delete m_lastStyleSheet.data(); m_lastStyleSheet = file; @@ -250,12 +273,10 @@ } else { StandardDocumentationView* view = new StandardDocumentationView(findWidget, parent); // QCH files created by doxygen can come with JavaScript - view->settings()->setAttribute(QWebSettings::JavascriptEnabled, true); if (!m_sharedQNAM) { m_sharedQNAM.reset(new HelpNetworkAccessManager(m_provider->engine())); } - view->page()->setNetworkAccessManager(m_sharedQNAM.data()); - view->page()->setLinkDelegationPolicy(QWebPage::DelegateAllLinks); + view->page()->profile()->installUrlSchemeHandler("qthelp", new QtHelpSchemeHandler(m_sharedQNAM.data(), this)); view->setContextMenuPolicy(Qt::CustomContextMenu); connect(view, &StandardDocumentationView::customContextMenuRequested, this, &QtHelpDocumentation::viewContextMenuRequested); @@ -276,7 +297,7 @@ return; QMenu menu; - QAction* copyAction = view->pageAction(QWebPage::Copy); + QAction* copyAction = view->pageAction(QWebEnginePage::Copy); copyAction->setIcon(QIcon::fromTheme("edit-copy")); menu.addAction(copyAction); diff --git a/projectmanagers/cmake/cmakedocumentation.cpp b/projectmanagers/cmake/cmakedocumentation.cpp --- a/projectmanagers/cmake/cmakedocumentation.cpp +++ b/projectmanagers/cmake/cmakedocumentation.cpp @@ -28,6 +28,7 @@ #include #include #include +#include #include #include