diff --git a/CMakeLists.txt b/CMakeLists.txt --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -62,7 +62,6 @@ endif() add_subdirectory( webenginepart ) -add_subdirectory( about ) add_subdirectory( pics ) #add_subdirectory( sidebar ) add_subdirectory( settings ) diff --git a/about/CMakeLists.txt b/about/CMakeLists.txt deleted file mode 100644 --- a/about/CMakeLists.txt +++ /dev/null @@ -1,22 +0,0 @@ -add_library(konq_aboutpage MODULE konq_aboutpage.cpp) - -target_link_libraries(konq_aboutpage - KF5::KHtml - KF5::IconThemes - Qt5::Widgets -) - -install(TARGETS konq_aboutpage DESTINATION ${KDE_INSTALL_PLUGINDIR}) - -install(FILES - top-left-konqueror.png - launch.html - intro.html - specs.html - tips.html - plugins.html - plugins_rtl.html - konq.css - DESTINATION ${KDE_INSTALL_DATADIR}/konqueror/about) -install(FILES konqaboutpage.desktop DESTINATION ${KDE_INSTALL_KSERVICETYPES5DIR}) -install(FILES konq_aboutpage.desktop DESTINATION ${KDE_INSTALL_KSERVICES5DIR}) diff --git a/about/konq_aboutpage.h b/about/konq_aboutpage.h deleted file mode 100644 --- a/about/konq_aboutpage.h +++ /dev/null @@ -1,47 +0,0 @@ -#ifndef __konq_aboutpage_h__ -#define __konq_aboutpage_h__ - -#include - -class QUrl; - -class KonqAboutPageSingleton -{ -public: - QString launch(); - QString intro(); - QString specs(); - QString tips(); - QString plugins(); - -private: - QString m_launch_html, m_intro_html, m_specs_html, m_tips_html, m_plugins_html; -}; - -class KonqAboutPage : public KHTMLPart -{ - Q_OBJECT -public: - KonqAboutPage(QWidget *parentWidget, QObject *parent, const QVariantList &args); - ~KonqAboutPage() override; - - bool openUrl(const QUrl &url) override; - - bool openFile() override; - - void saveState(QDataStream &stream) override; - void restoreState(QDataStream &stream) override; - -protected: - bool urlSelected(const QString &url, int button, int state, const QString &target, - const KParts::OpenUrlArguments &args = KParts::OpenUrlArguments(), - const KParts::BrowserArguments &browserArgs = KParts::BrowserArguments()) override; - -private: - void serve(const QString &, const QString &); - - QString m_htmlDoc; - QString m_what; -}; - -#endif diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -19,6 +19,7 @@ konqhistoryproxymodel.cpp konqhistoryview.cpp konqhistorysettings.cpp + konqurl.cpp ) ecm_qt_declare_logging_category(konquerorprivate_SRCS HEADER konqdebug.h IDENTIFIER KONQUEROR_LOG CATEGORY_NAME org.kde.konqueror) @@ -82,6 +83,7 @@ konqcloseditem.cpp konqhistorydialog.cpp konqstatusbarmessagelabel.cpp + konqurl.cpp ) kconfig_add_kcfg_files(konqueror_KDEINIT_SRCS konqsettingsxt.kcfgc) diff --git a/src/konqframe.cpp b/src/konqframe.cpp --- a/src/konqframe.cpp +++ b/src/konqframe.cpp @@ -19,6 +19,7 @@ // Own #include "konqframe.h" +#include "konqurl.h" // Local #include "konqtabs.h" @@ -240,7 +241,7 @@ if (m_pView && !m_pView->isPassiveMode()) { m_pView->mainWindow()->viewManager()->setActivePart(part()); - if (!m_pView->isLoading() && (m_pView->url().isEmpty() || m_pView->url() == QUrl(QStringLiteral("about:blank")))) { + if (!m_pView->isLoading() && (m_pView->url().isEmpty() || m_pView->url() == KonqUrl::url(KonqUrl::Type::Blank))) { //qCDebug(KONQUEROR_LOG) << "SET FOCUS on the location bar"; m_pView->mainWindow()->focusLocationBar(); // #84867 usability improvement } diff --git a/src/konqhistorymanager.cpp b/src/konqhistorymanager.cpp --- a/src/konqhistorymanager.cpp +++ b/src/konqhistorymanager.cpp @@ -20,6 +20,7 @@ #include "konqhistorymanager.h" #include +#include "konqurl.h" #include #include "konqdebug.h" @@ -155,7 +156,7 @@ void KonqHistoryManager::insert(const QString &url) { QUrl u(url); - if (!filterOut(u) || u.scheme() == QLatin1String("about")) { // remote URL + if (!filterOut(u) || KonqUrl::hasKonqScheme(u)) { // remote URL return; } // Local URL -> add to history diff --git a/src/konqmain.cpp b/src/konqmain.cpp --- a/src/konqmain.cpp +++ b/src/konqmain.cpp @@ -26,6 +26,7 @@ #include "konqsessionmanager.h" #include "konqview.h" #include "konqsettingsxt.h" +#include "konqurl.h" #include #include @@ -262,7 +263,7 @@ ++n; } } else if (parser.isSet("preload")) { - new KonqMainWindow(QUrl(QStringLiteral("about:blank"))); // prepare an empty window, with the web renderer preloaded + new KonqMainWindow(KonqUrl::url(KonqUrl::Type::Blank)); // prepare an empty window, with the web renderer preloaded } else { int ret = 0; KonqMainWindow *mainWindow = handleCommandLine(parser, QDir::currentPath(), &ret); diff --git a/src/konqmainwindow.cpp b/src/konqmainwindow.cpp --- a/src/konqmainwindow.cpp +++ b/src/konqmainwindow.cpp @@ -51,6 +51,7 @@ #include "konqhistorydialog.h" #include #include +#include "konqurl.h" #include #include @@ -501,27 +502,25 @@ qCDebug(KONQUEROR_LOG) << "url=" << _url << "mimeType=" << _mimeType << "_req=" << _req.debug() << "view=" << _view; #endif - // We like modifying args in this method :) QUrl url(_url); QString mimeType(_mimeType); KonqOpenURLRequest req(_req); if (mimeType.isEmpty()) { mimeType = req.args.mimeType(); } - if (!url.isValid()) { // I think we can't really get here anymore; I tried and didn't succeed. // URL filtering catches this case before hand, and in cases without filtering // (e.g. HTML link), the url is empty here, not invalid. // But just to be safe, let's keep this code path url = KParts::BrowserRun::makeErrorUrl(KIO::ERR_MALFORMED_URL, url.url(), url); - } else if (!KProtocolInfo::isKnownProtocol(url) && url.scheme() != QLatin1String("error") && url.scheme() != QLatin1String("about") && url.scheme() != QLatin1String("mailto")) { + } else if (!KProtocolInfo::isKnownProtocol(url) && url.scheme() != QLatin1String("error") && !KonqUrl::hasKonqScheme(url) && url.scheme() != QLatin1String("mailto")) { url = KParts::BrowserRun::makeErrorUrl(KIO::ERR_UNSUPPORTED_PROTOCOL, url.scheme(), url); } - if (url.url() == QLatin1String("about:blank") || url.scheme() == QLatin1String("error")) { + if (KonqUrl::isKonqBlank(url) || url.scheme() == QLatin1String("error")) { mimeType = QStringLiteral("text/html"); } @@ -640,7 +639,7 @@ } //qCDebug(KONQUEROR_LOG) << "trying openView for" << url << "( mimeType" << mimeType << ")"; - if (hasMimeType || url.url() == QLatin1String("about:") || url.url().startsWith(QLatin1String("about:konqueror")) || url.url() == QLatin1String("about:plugins")) { + if (hasMimeType || KonqUrl::isValidNotBlank(url)) { // Built-in view ? if (!openView(mimeType, url, view /* can be 0 */, req)) { @@ -797,19 +796,18 @@ QString serviceName = req.serviceName; // default: none provided const QString urlStr = url.url(); - if (urlStr == QLatin1String("about:") || urlStr.startsWith(QLatin1String("about:konqueror")) || urlStr == QLatin1String("about:plugins")) { - mimeType = QStringLiteral("KonqAboutPage"); // not KParts/ReadOnlyPart, it fills the Location menu ! :) - serviceName = QStringLiteral("konq_aboutpage"); + if (KonqUrl::isValidNotBlank(urlStr)) { + mimeType = QStringLiteral("text/html"); originalURL = req.typedUrl.isEmpty() ? QString() : req.typedUrl; - } else if (urlStr == QLatin1String("about:blank") && req.typedUrl.isEmpty()) { + } else if (KonqUrl::isKonqBlank(urlStr) && req.typedUrl.isEmpty()) { originalURL.clear(); } bool forceAutoEmbed = req.forceAutoEmbed || req.userRequestedReload; if (!req.typedUrl.isEmpty()) { // the user _typed_ the URL, he wants it in Konq. forceAutoEmbed = true; } - if (url.scheme() == QLatin1String("about") || url.scheme() == QLatin1String("error")) { + if (KonqUrl::hasKonqScheme(url) || url.scheme() == QLatin1String("error")) { forceAutoEmbed = true; } // Related to KonqFactory::createView @@ -1200,7 +1198,7 @@ m_pViewManager->showTab(newView); } - openUrl(newView, url.isEmpty() ? QUrl(QStringLiteral("about:blank")) : url, QString(), req); + openUrl(newView, url.isEmpty() ? KonqUrl::url(KonqUrl::Type::Blank) : url, QString(), req); newView->setViewName(browserArgs.frameName); *part = newView->part(); @@ -2318,16 +2316,16 @@ void KonqMainWindow::slotAddTab() { - // we can hardcode text/html because this is what about:blank will use anyway + // we can hardcode text/html because this is what konq:blank will use anyway KonqView *newView = m_pViewManager->addTab(QStringLiteral("text/html"), QString(), false, KonqSettings::openAfterCurrentPage()); if (!newView) { return; } - openUrl(newView, QUrl(QStringLiteral("about:blank")), QString()); + openUrl(newView, KonqUrl::url(KonqUrl::Type::Blank), QString()); //HACK!! QTabBar likes to steal focus when changing widgets. This can result //in a flicker since we don't want it to get focus we want the combo to get @@ -3908,7 +3906,7 @@ bool KonqMainWindow::isPreloaded() const { - return !isVisible() && m_mapViews.count() == 1 && m_currentView->url().toString() == "about:blank"; + return !isVisible() && m_mapViews.count() == 1 && KonqUrl::isKonqBlank(m_currentView->url().toString()); } void KonqMainWindow::updateToolBarActions(bool pendingAction /*=false*/) @@ -4999,7 +4997,7 @@ void KonqMainWindow::slotIntro() { - openUrl(nullptr, QUrl(QStringLiteral("about:"))); + openUrl(nullptr, KonqUrl::url(KonqUrl::Type::NoPath)); } void KonqMainWindow::goURL() @@ -5020,7 +5018,7 @@ void KonqMainWindow::slotAddClosedUrl(KonqFrameBase *tab) { qCDebug(KONQUEROR_LOG); - QString title(i18n("no name")), url(QStringLiteral("about:blank")); + QString title(i18n("no name")), url(KonqUrl::latin1(KonqUrl::Type::Blank)); // Did the tab contain a single frame, or a splitter? KonqFrame *frame = dynamic_cast(tab); diff --git a/src/konqmainwindowfactory.cpp b/src/konqmainwindowfactory.cpp --- a/src/konqmainwindowfactory.cpp +++ b/src/konqmainwindowfactory.cpp @@ -22,6 +22,8 @@ #include "konqview.h" #include "konqsettingsxt.h" #include "konqdebug.h" +#include "konqurl.h" + #include #include #include @@ -46,7 +48,7 @@ static void ensurePreloadedWindow() { if (KonqSettings::alwaysHavePreloaded()) { - QTimer::singleShot(500, nullptr, []() { new KonqMainWindow(QUrl(QStringLiteral("about:blank"))); }); + QTimer::singleShot(500, nullptr, []() { new KonqMainWindow(QUrl(KonqUrl::latin1(KonqUrl::Type::Blank))); }); } } diff --git a/src/konqmisc.cpp b/src/konqmisc.cpp --- a/src/konqmisc.cpp +++ b/src/konqmisc.cpp @@ -23,6 +23,7 @@ #include "konqviewmanager.h" #include "konqview.h" #include "konqmainwindowfactory.h" +#include "konqurl.h" #include "konqdebug.h" #include @@ -70,7 +71,7 @@ { Q_UNUSED(parent); // Useful if we want to change the error handling again - if (!_url.startsWith(QLatin1String("about:"))) { // Don't filter "about:" URLs + if (!KonqUrl::canBeKonqUrl(_url)) { // Don't filter "konq:" URLs KUriFilterData data(_url); if (currentDirectory.isLocalFile()) { @@ -98,11 +99,9 @@ return KParts::BrowserRun::makeErrorUrl(KIO::ERR_MALFORMED_URL, _url, QUrl(_url)); } - const bool isKnownAbout = (_url == QLatin1String("about:blank") - || _url == QLatin1String("about:plugins") - || _url.startsWith(QLatin1String("about:konqueror"))); + const bool isKnownAbout = KonqUrl::hasKnownPathRoot(_url); - return isKnownAbout ? QUrl(_url) : QUrl(QStringLiteral("about:")); + return isKnownAbout ? QUrl(_url) : KonqUrl::url(KonqUrl::Type::NoPath); } QString KonqMisc::encodeFilename(QString filename) diff --git a/src/konqueror.kcfg b/src/konqueror.kcfg --- a/src/konqueror.kcfg +++ b/src/konqueror.kcfg @@ -7,7 +7,7 @@ - about:konqueror + konq:konqueror This is the URL of the web page where Konqueror will start from. diff --git a/src/konqurl.h b/src/konqurl.h new file mode 100644 --- /dev/null +++ b/src/konqurl.h @@ -0,0 +1,62 @@ +/* + * This file is part of the KDE project. + * + * Copyright (C) 2020 Stefano Crocco + * + * This library is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as published by the + * Free Software Foundation; either version 2.1 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 Lesser General Public License for more + * details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see . + * +*/ + +#ifndef KONQURL_H +#define KONQURL_H + +#include +#include +#include + +namespace KonqUrl { + + enum class Type{ + Scheme, + NoPath, + Blank, + Konqueror, + Launch, + Specs, + Intro, + Tips, + Plugins + }; + + QLatin1String latin1(Type type = Type::NoPath); + + QUrl url(Type type = Type::NoPath); + + bool hasKonqScheme(const QUrl &url); + + bool canBeKonqUrl(const QString &url); + + bool hasKnownPathRoot(const QString &url); + + bool isValidNotBlank(const QString &url); + + bool isValidNotBlank(const QUrl &url); + + bool isKonqBlank(const QString &url); + + bool isKonqBlank(const QUrl &url); + +}; + +#endif // KONQURL_H diff --git a/src/konqurl.cpp b/src/konqurl.cpp new file mode 100644 --- /dev/null +++ b/src/konqurl.cpp @@ -0,0 +1,75 @@ +/* + * This file is part of the KDE project. + * + * Copyright (C) 2020 Stefano Crocco + * + * This library is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as published by the + * Free Software Foundation; either version 2.1 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 Lesser General Public License for more + * details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see . + * +*/ + +#include "konqurl.h" + +namespace KonqUrl { + + QLatin1String latin1(KonqUrl::Type type) + { + static QLatin1String s_konqUrls[9] = { + QLatin1String("konq"), + QLatin1String("konq:"), + QLatin1String("konq:blank"), + QLatin1String("konq:konqueror"), + QLatin1String("konq:konqueror/launch"), + QLatin1String("konq:konqueror/specs"), + QLatin1String("konq:konqueror/intro"), + QLatin1String("konq:konqueror/tips"), + QLatin1String("konq:plugins"), + }; + return s_konqUrls[static_cast(type)]; + } + + QUrl url(KonqUrl::Type type) { + return QUrl(latin1(type)); + } + + bool hasKonqScheme(const QUrl& url) + { + return url.scheme() == latin1(Type::Scheme); + } + + + bool canBeKonqUrl(const QString &url) { + return url.startsWith(latin1(Type::NoPath)); + } + + bool hasKnownPathRoot(const QString &url) { + return url == latin1(Type::Blank) || url == latin1(Type::Plugins) || url.startsWith(latin1(Type::Konqueror)); + } + + bool isValidNotBlank(const QString &url) { + return url == latin1(Type::NoPath) || url == latin1(Type::Plugins) || url.startsWith(latin1(Type::Konqueror)); + } + + bool isValidNotBlank(const QUrl &url) { + return isValidNotBlank(url.url()); + } + + bool isKonqBlank(const QString &url) { + return url == latin1(Type::Blank); + } + + bool isKonqBlank(const QUrl &url) { + return url.url() == latin1(Type::Blank); + } + +} diff --git a/src/konqviewmanager.cpp b/src/konqviewmanager.cpp --- a/src/konqviewmanager.cpp +++ b/src/konqviewmanager.cpp @@ -29,6 +29,7 @@ #include "konqsettingsxt.h" #include "konqframevisitor.h" #include +#include "konqurl.h" #include #include @@ -911,7 +912,7 @@ clear(); - if (forcedUrl.url() != QLatin1String("about:blank")) { + if (forcedUrl.url() != KonqUrl::latin1(KonqUrl::Type::Blank)) { loadRootItem(profileGroup, m_pMainWindow, defaultURL, openUrl && forcedUrl.isEmpty(), forcedUrl, req.serviceName); } else { // ## in this case we won't resize the window, so bool resetWindow could be useful after all? @@ -1134,7 +1135,7 @@ serviceType = cfg.readEntry(QStringLiteral("ServiceType").prepend(prefix), QStringLiteral("inode/directory")); serviceName = cfg.readEntry(QStringLiteral("ServiceName").prepend(prefix), QString()); if (serviceName == QLatin1String("konq_aboutpage")) { - if ((!forcedUrl.isEmpty() && forcedUrl.scheme() != QLatin1String("about")) || + if ((!forcedUrl.isEmpty() && !KonqUrl::hasKonqScheme(forcedUrl)) || (forcedUrl.isEmpty() && openUrl == false)) { // e.g. window.open // No point in loading the about page if we're going to replace it with a KHTML part right away serviceType = QStringLiteral("text/html"); @@ -1186,9 +1187,9 @@ const QString urlKey = QStringLiteral("URL").prepend(prefix); QUrl url; if (cfg.hasKey(urlKey)) { - url = QUrl(cfg.readPathEntry(urlKey, QStringLiteral("about:blank"))); + url = QUrl(cfg.readPathEntry(urlKey, KonqUrl::latin1(KonqUrl::Type::Blank))); } else if (urlKey == QLatin1String("empty_URL")) { // old stuff, not in use anymore - url = QUrl(QStringLiteral("about:blank")); + url = QUrl(KonqUrl::latin1(KonqUrl::Type::Blank)); } else { url = defaultURL; } @@ -1198,7 +1199,7 @@ //childView->openUrl( url, url.toDisplayString() ); // We need view-follows-view (for the dirtree, for instance) KonqOpenURLRequest req; - if (url.scheme() != QLatin1String("about")) { + if (!KonqUrl::hasKonqScheme(url)) { req.typedUrl = url.toDisplayString(); } m_pMainWindow->openView(serviceType, url, childView, req); diff --git a/webenginepart/src/CMakeLists.txt b/webenginepart/src/CMakeLists.txt --- a/webenginepart/src/CMakeLists.txt +++ b/webenginepart/src/CMakeLists.txt @@ -25,6 +25,7 @@ ui/searchbar.cpp ui/passwordbar.cpp ui/featurepermissionbar.cpp + about/konq_aboutpage.cpp ) if(NOT Qt5WebEngineWidgets_VERSION VERSION_LESS "5.12.0") @@ -82,3 +83,5 @@ install(FILES webenginepart.rc DESTINATION ${KDE_INSTALL_KXMLGUI5DIR}/webenginepart) install(FILES error.html DESTINATION ${KDE_INSTALL_DATADIR}/webenginepart) + +add_subdirectory(about) diff --git a/webenginepart/src/about/CMakeLists.txt b/webenginepart/src/about/CMakeLists.txt new file mode 100644 --- /dev/null +++ b/webenginepart/src/about/CMakeLists.txt @@ -0,0 +1,10 @@ +install(FILES + top-left-konqueror.png + launch.html + intro.html + specs.html + tips.html + plugins.html + plugins_rtl.html + konq.css + DESTINATION ${KDE_INSTALL_DATADIR}/konqueror/about) diff --git a/about/intro.html b/webenginepart/src/about/intro.html rename from about/intro.html rename to webenginepart/src/about/intro.html --- a/about/intro.html +++ b/webenginepart/src/about/intro.html @@ -41,10 +41,10 @@ %6
@@ -70,7 +70,7 @@ %15

- diff --git a/about/konq.css b/webenginepart/src/about/konq.css rename from about/konq.css rename to webenginepart/src/about/konq.css diff --git a/webenginepart/src/about/konq_aboutpage.h b/webenginepart/src/about/konq_aboutpage.h new file mode 100644 --- /dev/null +++ b/webenginepart/src/about/konq_aboutpage.h @@ -0,0 +1,36 @@ +#ifndef __konq_aboutpage_h__ +#define __konq_aboutpage_h__ + +#include + +class QUrl; + +class KonqAboutPageSingleton +{ +public: + QString launch(); + QString intro(); + QString specs(); + QString tips(); + QString plugins(); + +private: + QString m_launch_html, m_intro_html, m_specs_html, m_tips_html, m_plugins_html; +}; + +class KonqUrlSchemeHandler : public QWebEngineUrlSchemeHandler +{ + Q_OBJECT +public: + KonqUrlSchemeHandler(QObject *parent=Q_NULLPTR); + ~KonqUrlSchemeHandler() Q_DECL_OVERRIDE; + + void requestStarted(QWebEngineUrlRequestJob *req) Q_DECL_OVERRIDE; + +private: + + QString m_htmlDoc; + QString m_what; +}; + +#endif diff --git a/about/konq_aboutpage.cpp b/webenginepart/src/about/konq_aboutpage.cpp rename from about/konq_aboutpage.cpp rename to webenginepart/src/about/konq_aboutpage.cpp --- a/about/konq_aboutpage.cpp +++ b/webenginepart/src/about/konq_aboutpage.cpp @@ -5,16 +5,14 @@ #include #include #include +#include +#include +#include +#include +#include -#include -#include #include -#include -#include -#include -#include - -K_PLUGIN_FACTORY(KonqAboutPageFactory, registerPlugin();) +#include Q_GLOBAL_STATIC(KonqAboutPageSingleton, s_staticData) @@ -35,7 +33,7 @@ res = t.readAll(); - // otherwise all embedded objects are referenced as about:/... + // otherwise all embedded objects are referenced as konq/... QString basehref = QLatin1String("\n"); @@ -216,7 +214,7 @@ .arg(i18n("Enable Java (globally) here.", QStringLiteral("exec:/kcmshell5 khtml_java_js"))) // TODO Maybe test if Java is enabled ? .arg(i18n("NPAPI plugins (for viewing Flash®, etc.)", QStringLiteral("https://get.adobe.com/flashplayer/"), - QStringLiteral("about:plugins"))) + QStringLiteral("konqplugins"))) .arg(i18n("built-in")) .arg(i18n("Secure Sockets Layer")) .arg(i18n("(TLS/SSL v2/3) for secure communications up to 168bit")) @@ -239,7 +237,7 @@ .arg(i18n("Popup")) .arg(i18n("(Short-) Automatic")) .arg(QStringLiteral("")).arg(continue_icon_path) - .arg(i18nc("Link that points to the first page of the Konqueror 'about page', Starting Points contains links to Home, Network Folders, Trash, etc.", "Return to Starting Points", QStringLiteral("about:konqueror"))) + .arg(i18nc("Link that points to the first page of the Konqueror 'about page', Starting Points contains links to Home, Network Folders, Trash, etc.", "Return to Starting Points", QStringLiteral("konq:konqueror"))) ; @@ -348,93 +346,33 @@ return res; } -KonqAboutPage::KonqAboutPage(QWidget *parentWidget, QObject *parent, const QVariantList &args) - : KHTMLPart(parentWidget, parent, BrowserViewGUI) -{ - Q_UNUSED(args) -} - -KonqAboutPage::~KonqAboutPage() -{ -} - -bool KonqAboutPage::openUrl(const QUrl &u) -{ - emit started(nullptr); - if (u.url() == QLatin1String("about:plugins")) { - serve(s_staticData->plugins(), QStringLiteral("plugins")); - } else if (u.url() == QLatin1String("about:konqueror/intro")) { - serve(s_staticData->intro(), QStringLiteral("konqueror/intro")); - } else if (u.url() == QLatin1String("about:konqueror/specs")) { - serve(s_staticData->specs(), QStringLiteral("konqueror/specs")); - } else if (u.url() == QLatin1String("about:konqueror/tips")) { - serve(s_staticData->tips(), QStringLiteral("konqueror/tips")); - } else { - serve(s_staticData->launch(), QStringLiteral("konqueror")); - } - emit completed(); - return true; -} - -bool KonqAboutPage::openFile() +KonqUrlSchemeHandler::KonqUrlSchemeHandler(QObject *parent) : QWebEngineUrlSchemeHandler(parent) { - return true; } -void KonqAboutPage::saveState(QDataStream &stream) +KonqUrlSchemeHandler::~KonqUrlSchemeHandler() { - stream << m_htmlDoc; - stream << m_what; } -void KonqAboutPage::restoreState(QDataStream &stream) +void KonqUrlSchemeHandler::requestStarted(QWebEngineUrlRequestJob *req) { - stream >> m_htmlDoc; - stream >> m_what; - serve(m_htmlDoc, m_what); + QBuffer* buf = new QBuffer(this); + buf->open(QBuffer::ReadWrite); + connect(buf, &QIODevice::aboutToClose, buf, &QObject::deleteLater); + QString data; + QString path = req->requestUrl().path(); + if (path.endsWith("specs")) { + data = s_staticData->specs(); + } else if (path.endsWith("intro")) { + data = s_staticData->intro(); + } else if (path.endsWith("tips")) { + data = s_staticData->tips(); + } else if (path.endsWith("plugins")) { + data = s_staticData->plugins(); + } else { + data = s_staticData->launch(); + } + buf->write(data.toUtf8()); + buf->seek(0); + req->reply("text/html", buf); } - -void KonqAboutPage::serve(const QString &html, const QString &what) -{ - m_what = what; - begin(QUrl(QStringLiteral("about:%1").arg(what))); - write(html); - end(); - m_htmlDoc = html; -} - -bool KonqAboutPage::urlSelected(const QString &url, int button, int state, const QString &target, - const KParts::OpenUrlArguments &args, - const KParts::BrowserArguments &browserArgs) -{ - QUrl u(url); - if (u.scheme() == QLatin1String("exec")) { - QStringList execArgs = url.mid(6).split(QChar(' '), QString::SkipEmptyParts); - QString executable = execArgs.first(); - execArgs.erase(execArgs.begin()); - KToolInvocation::kdeinitExec(executable, execArgs); - return true; - } - - if (url == QLatin1String("about:konqueror")) { - emit browserExtension()->openUrlNotify(); - serve(s_staticData->launch(), QStringLiteral("konqueror")); - return true; - } else if (url == QLatin1String("about:konqueror/intro")) { - emit browserExtension()->openUrlNotify(); - serve(s_staticData->intro(), QStringLiteral("konqueror/intro")); - return true; - } else if (url == QLatin1String("about:konqueror/specs")) { - emit browserExtension()->openUrlNotify(); - serve(s_staticData->specs(), QStringLiteral("konqueror/specs")); - return true; - } else if (url == QLatin1String("about:konqueror/tips")) { - emit browserExtension()->openUrlNotify(); - serve(s_staticData->tips(), QStringLiteral("konqueror/tips")); - return true; - } - - return KHTMLPart::urlSelected(url, button, state, target, args, browserArgs); -} - -#include "konq_aboutpage.moc" diff --git a/about/konq_aboutpage.desktop b/webenginepart/src/about/konq_aboutpage.desktop rename from about/konq_aboutpage.desktop rename to webenginepart/src/about/konq_aboutpage.desktop diff --git a/about/konqaboutpage.desktop b/webenginepart/src/about/konqaboutpage.desktop rename from about/konqaboutpage.desktop rename to webenginepart/src/about/konqaboutpage.desktop diff --git a/about/launch.html b/webenginepart/src/about/launch.html rename from about/launch.html rename to webenginepart/src/about/launch.html --- a/about/launch.html +++ b/webenginepart/src/about/launch.html @@ -42,9 +42,9 @@ @@ -91,7 +91,7 @@   - diff --git a/about/plugins.html b/webenginepart/src/about/plugins.html rename from about/plugins.html rename to webenginepart/src/about/plugins.html diff --git a/about/plugins_rtl.html b/webenginepart/src/about/plugins_rtl.html rename from about/plugins_rtl.html rename to webenginepart/src/about/plugins_rtl.html diff --git a/about/specs.html b/webenginepart/src/about/specs.html rename from about/specs.html rename to webenginepart/src/about/specs.html --- a/about/specs.html +++ b/webenginepart/src/about/specs.html @@ -41,9 +41,9 @@ %6
@@ -186,7 +186,7 @@ diff --git a/about/tips.html b/webenginepart/src/about/tips.html rename from about/tips.html rename to webenginepart/src/about/tips.html --- a/about/tips.html +++ b/webenginepart/src/about/tips.html @@ -41,10 +41,10 @@ %6
@@ -108,7 +108,7 @@ - diff --git a/about/top-left-konqueror.png b/webenginepart/src/about/top-left-konqueror.png rename from about/top-left-konqueror.png rename to webenginepart/src/about/top-left-konqueror.png index 9428465f92a9c06cb1285f0c8e8b1cd00acdd23d..9428465f92a9c06cb1285f0c8e8b1cd00acdd23d GIT binary patch literal 27425 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 literal 27425 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 diff --git a/webenginepart/src/webenginepart.cpp b/webenginepart/src/webenginepart.cpp --- a/webenginepart/src/webenginepart.cpp +++ b/webenginepart/src/webenginepart.cpp @@ -24,6 +24,7 @@ #include "webenginepart.h" #include "webenginepartkiohandler.h" +#include "about/konq_aboutpage.h" #include @@ -89,7 +90,7 @@ static bool needToInitUrlSchemes = true; if (needToInitUrlSchemes) { needToInitUrlSchemes = false; - QVector localSchemes = {"error"}; + QVector localSchemes = {"error", "konq"}; const QStringList protocols = KProtocolInfo::protocols(); for(const QString &prot : protocols){ #if KIO_VERSION >= QT_VERSION_CHECK(5,60,0) @@ -131,6 +132,7 @@ QWebEngineProfile *prof = QWebEngineProfile::defaultProfile(); if (!prof->urlSchemeHandler("error")) { prof->installUrlSchemeHandler("error", new WebEnginePartErrorSchemeHandler(prof)); + prof->installUrlSchemeHandler("konq", new KonqUrlSchemeHandler(prof)); prof->installUrlSchemeHandler("help", new WebEnginePartKIOHandler(prof)); } static WebEnginePartCookieJar s_cookieJar(prof, nullptr);