diff --git a/src/articleviewer-ng/webengine/articleviewerwebengine.cpp b/src/articleviewer-ng/webengine/articleviewerwebengine.cpp index b70c1453..2463fdf8 100644 --- a/src/articleviewer-ng/webengine/articleviewerwebengine.cpp +++ b/src/articleviewer-ng/webengine/articleviewerwebengine.cpp @@ -1,494 +1,496 @@ /* Copyright (C) 2015-2018 Montel Laurent 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 of the License, 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. You should have received a copy of the GNU General Public License along with this program; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "articleviewerwebengine.h" #include "akregator_debug.h" #include "articleviewerwebenginepage.h" #include "webengine/urlhandlerwebenginemanager.h" #include #include "actionmanager.h" #include "akregatorconfig.h" #include "actions/actions.h" #include "urlhandler/webengine/urlhandlerwebengine.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace Akregator; ArticleViewerWebEngine::ArticleViewerWebEngine(KActionCollection *ac, QWidget *parent) : WebEngineViewer::WebEngineView(parent) , mActionCollection(ac) , mLastButtonClicked(LeftButton) , mViewerPluginToolManager(nullptr) { mNetworkAccessManager = new WebEngineViewer::InterceptorManager(this, ac, this); QWebEngineProfile *profile = QWebEngineProfile::defaultProfile(); mPageEngine = new ArticleViewerWebEnginePage(profile, this); profile->setPersistentCookiesPolicy(QWebEngineProfile::ForcePersistentCookies); setPage(mPageEngine); connect(this, &ArticleViewerWebEngine::showContextMenu, this, &ArticleViewerWebEngine::slotShowContextMenu); setFocusPolicy(Qt::WheelFocus); connect(mPageEngine, &ArticleViewerWebEnginePage::urlClicked, this, &ArticleViewerWebEngine::slotLinkClicked); mWebEngineViewAccessKey = new WebEngineViewer::WebEngineAccessKey(this, this); mWebEngineViewAccessKey->setActionCollection(mActionCollection); connect(mWebEngineViewAccessKey, &WebEngineViewer::WebEngineAccessKey::openUrl, this, &ArticleViewerWebEngine::slotLinkClicked); connect(this, &ArticleViewerWebEngine::loadStarted, this, &ArticleViewerWebEngine::slotLoadStarted); connect(this, &ArticleViewerWebEngine::loadFinished, this, &ArticleViewerWebEngine::slotLoadFinished); connect(page(), &QWebEnginePage::linkHovered, this, &ArticleViewerWebEngine::slotLinkHovered); setContextMenuPolicy(Qt::DefaultContextMenu); mWebShortcutMenuManager = new KIO::KUriFilterSearchProviderActions(this); mShareServiceManager = new PimCommon::ShareServiceUrlManager(this); connect(mShareServiceManager, &PimCommon::ShareServiceUrlManager::serviceUrlSelected, this, &ArticleViewerWebEngine::slotServiceUrlSelected); connect(page(), &QWebEnginePage::audioMutedChanged, this, &ArticleViewerWebEngine::slotWebPageMutedOrAudibleChanged); connect(page(), &QWebEnginePage::recentlyAudibleChanged, this, &ArticleViewerWebEngine::slotWebPageMutedOrAudibleChanged); connect(phishingDatabase(), &WebEngineViewer::LocalDataBaseManager::checkUrlFinished, this, &ArticleViewerWebEngine::slotCheckedUrlFinished); } ArticleViewerWebEngine::~ArticleViewerWebEngine() { } void ArticleViewerWebEngine::execPrintPreviewPage(QPrinter *printer, int timeout) { - mPageEngine->execPrintPreviewPage(printer, timeout); + if (!mPageEngine->execPrintPreviewPage(printer, timeout)) { + qCWarning(AKREGATOR_LOG) << "Impossible to print page"; + } } void ArticleViewerWebEngine::slotWebPageMutedOrAudibleChanged() { Q_EMIT webPageMutedOrAudibleChanged(page()->isAudioMuted(), page()->recentlyAudible()); } QVariantHash ArticleViewerWebEngine::introductionData() const { QVariantHash data; data[QStringLiteral("icon")] = QStringLiteral("akregator"); data[QStringLiteral("name")] = i18n("Akregator"); data[QStringLiteral("subtitle")] = i18n("Akregator is a KDE news feed reader."); data[QStringLiteral("version")] = KAboutData::applicationData().version(); return data; } void ArticleViewerWebEngine::showAboutPage() { paintAboutScreen(QStringLiteral(":/about/introduction_akregator.html"), introductionData()); } void ArticleViewerWebEngine::paintAboutScreen(const QString &templateName, const QVariantHash &data) { GrantleeTheme::ThemeManager manager(QStringLiteral("splashPage"), QStringLiteral("splash.theme"), nullptr, QStringLiteral("messageviewer/about/")); GrantleeTheme::Theme theme = manager.theme(QStringLiteral("default")); if (theme.isValid()) { setHtml(theme.render(templateName, data, QByteArrayLiteral("akregator")), QUrl::fromLocalFile(theme.absolutePath() + QLatin1Char('/'))); } else { qCDebug(AKREGATOR_LOG) << "Theme error: failed to find splash theme"; } } void ArticleViewerWebEngine::slotServiceUrlSelected(PimCommon::ShareServiceUrlManager::ServiceType type) { if (mCurrentUrl.isEmpty()) { return; } const QUrl url = mShareServiceManager->generateServiceUrl(mCurrentUrl.url(), QString(), type); mShareServiceManager->openUrl(url); } void ArticleViewerWebEngine::slotSaveLinkAs() { QUrl tmp(mCurrentUrl); if (tmp.fileName().isEmpty()) { tmp = tmp.adjusted(QUrl::RemoveFilename); tmp.setPath(tmp.path() + QLatin1String("index.html")); } KParts::BrowserRun::simpleSave(tmp, tmp.fileName()); } void ArticleViewerWebEngine::slotSaveImageOnDiskInFrame() { slotSaveLinkAs(); } void ArticleViewerWebEngine::slotCopyImageLocationInFrame() { slotCopyLinkAddress(); } void ArticleViewerWebEngine::slotMute(bool mute) { page()->setAudioMuted(mute); } void ArticleViewerWebEngine::slotCopyLinkAddress() { if (mCurrentUrl.isEmpty()) { return; } QClipboard *cb = QApplication::clipboard(); cb->setText(mCurrentUrl.toString(), QClipboard::Clipboard); // don't set url to selection as it's a no-no according to a fd.o spec // which spec? Nobody seems to care (tested Firefox (3.5.10) Konqueror,and KMail (4.2.3)), so I re-enable the following line unless someone gives // a good reason to remove it again (bug 183022) --Frank cb->setText(mCurrentUrl.toString(), QClipboard::Selection); } void ArticleViewerWebEngine::contextMenuEvent(QContextMenuEvent *e) { displayContextMenu(e->pos()); } void ArticleViewerWebEngine::slotShowContextMenu(const QPoint &pos) { displayContextMenu(pos); } void ArticleViewerWebEngine::slotCopy() { triggerPageAction(QWebEnginePage::Copy); } void ArticleViewerWebEngine::slotLoadFinished() { restoreCurrentPosition(); unsetCursor(); clearRelativePosition(); } void ArticleViewerWebEngine::slotLoadStarted() { mWebEngineViewAccessKey->hideAccessKeys(); setCursor(Qt::WaitCursor); } void ArticleViewerWebEngine::slotWebHitFinished(const WebEngineViewer::WebHitTestResult &result) { mCurrentUrl = result.linkUrl(); if (URLHandlerWebEngineManager::instance()->handleContextMenuRequest(mCurrentUrl, mapToGlobal(result.pos()), this)) { return; } QMenu popup(this); const bool noContentSelected = selectedText().isEmpty(); if (noContentSelected) { if (!mCurrentUrl.isEmpty()) { { QAction *act = createOpenLinkInNewTabAction(mCurrentUrl, &popup); connect(act, &QAction::triggered, this, &ArticleViewerWebEngine::slotOpenLinkInBackgroundTab); popup.addAction(act); } { QAction *act = createOpenLinkInExternalBrowserAction(mCurrentUrl, &popup); connect(act, &QAction::triggered, this, &ArticleViewerWebEngine::slotOpenLinkInBrowser); popup.addAction(act); } popup.addSeparator(); popup.addAction(mActionCollection->action(QStringLiteral("savelinkas"))); popup.addAction(mActionCollection->action(QStringLiteral("copylinkaddress"))); } if (!result.imageUrl().isEmpty()) { popup.addSeparator(); popup.addAction(mActionCollection->action(QStringLiteral("copy_image_location"))); popup.addAction(mActionCollection->action(QStringLiteral("saveas_imageurl"))); } popup.addSeparator(); popup.addActions(viewerPluginActionList(MessageViewer::ViewerPluginInterface::NeedUrl)); popup.addSeparator(); popup.addAction(mShareServiceManager->menu()); } else { popup.addAction(ActionManager::getInstance()->action(QStringLiteral("viewer_copy"))); popup.addSeparator(); mWebShortcutMenuManager->setSelectedText(page()->selectedText()); mWebShortcutMenuManager->addWebShortcutsToMenu(&popup); popup.addSeparator(); popup.addActions(viewerPluginActionList(MessageViewer::ViewerPluginInterface::NeedSelection)); } popup.addSeparator(); popup.addAction(ActionManager::getInstance()->action(QStringLiteral("viewer_print"))); popup.addAction(ActionManager::getInstance()->action(QStringLiteral("viewer_printpreview"))); popup.addSeparator(); popup.addAction(ActionManager::getInstance()->action(QStringLiteral("tab_mute"))); popup.addAction(ActionManager::getInstance()->action(QStringLiteral("tab_unmute"))); popup.addSeparator(); popup.addAction(ActionManager::getInstance()->action(QStringLiteral("find_in_messages"))); if (KPIMTextEdit::TextToSpeech::self()->isReady()) { popup.addSeparator(); popup.addAction(ActionManager::getInstance()->action(QStringLiteral("speak_text"))); } popup.exec(mapToGlobal(result.pos())); } void ArticleViewerWebEngine::displayContextMenu(const QPoint &pos) { WebEngineViewer::WebHitTest *webHit = mPageEngine->hitTestContent(pos); connect(webHit, &WebEngineViewer::WebHitTest::finished, this, &ArticleViewerWebEngine::slotWebHitFinished); } void ArticleViewerWebEngine::slotLinkHovered(const QString &link) { QString msg = URLHandlerWebEngineManager::instance()->statusBarMessage(QUrl(link), this); if (msg.isEmpty()) { msg = link; } Q_EMIT showStatusBarMessage(msg); } void ArticleViewerWebEngine::forwardKeyReleaseEvent(QKeyEvent *e) { if (Settings::self()->accessKeyEnabled()) { mWebEngineViewAccessKey->keyReleaseEvent(e); } } void ArticleViewerWebEngine::forwardKeyPressEvent(QKeyEvent *e) { if (e && hasFocus()) { if (Settings::self()->accessKeyEnabled()) { mWebEngineViewAccessKey->keyPressEvent(e); } } } void ArticleViewerWebEngine::forwardWheelEvent(QWheelEvent *e) { if (Settings::self()->accessKeyEnabled()) { mWebEngineViewAccessKey->wheelEvent(e); } if (QApplication::keyboardModifiers() & Qt::ControlModifier) { const int numDegrees = e->delta() / 8; const int numSteps = numDegrees / 15; const qreal factor = ActionManager::getInstance()->zoomActionMenu()->zoomFactor() + numSteps * 10; if (factor >= 10 && factor <= 300) { ActionManager::getInstance()->zoomActionMenu()->setZoomFactor(factor); ActionManager::getInstance()->zoomActionMenu()->setWebViewerZoomFactor(factor / 100.0); } e->accept(); } } void ArticleViewerWebEngine::resizeEvent(QResizeEvent *e) { if (Settings::self()->accessKeyEnabled()) { mWebEngineViewAccessKey->resizeEvent(e); } QWebEngineView::resizeEvent(e); } void ArticleViewerWebEngine::disableIntroduction() { KGuiItem yesButton(KStandardGuiItem::yes()); yesButton.setText(i18n("Disable")); KGuiItem noButton(KStandardGuiItem::no()); noButton.setText(i18n("Keep Enabled")); if (KMessageBox::questionYesNo(this, i18n("Are you sure you want to disable this introduction page?"), i18n("Disable Introduction Page"), yesButton, noButton) == KMessageBox::Yes) { Settings::self()->setDisableIntroduction(true); Settings::self()->save(); } } void ArticleViewerWebEngine::setArticleAction(ArticleViewerWebEngine::ArticleAction type, const QString &articleId, const QString &feed) { Q_EMIT articleAction(type, articleId, feed); } void ArticleViewerWebEngine::restoreCurrentPosition() { mPageEngine->runJavaScript(WebEngineViewer::WebEngineScript::scrollToRelativePosition(relativePosition())); } void ArticleViewerWebEngine::forwardMouseReleaseEvent(QMouseEvent *event) { if (event->button() & Qt::RightButton) { Q_EMIT showContextMenu(event->pos()); mLastButtonClicked = RightButton; } else if (event->button() & Qt::MiddleButton) { mLastButtonClicked = MiddleButton; } else if (event->button() & Qt::LeftButton) { mLastButtonClicked = LeftButton; } } bool ArticleViewerWebEngine::urlIsAMalwareButContinue() { if (KMessageBox::No == KMessageBox::warningYesNo(this, i18n("This web site is a malware, do you want to continue to show it?"), i18n("Malware"))) { return false; } return true; } void ArticleViewerWebEngine::slotCheckedUrlFinished(const QUrl &url, WebEngineViewer::CheckPhishingUrlUtil::UrlStatus status) { switch (status) { case WebEngineViewer::CheckPhishingUrlUtil::BrokenNetwork: KMessageBox::error(this, i18n("The network is broken."), i18n("Check Phishing Url")); break; case WebEngineViewer::CheckPhishingUrlUtil::InvalidUrl: KMessageBox::error(this, i18n("The url %1 is not valid.", url.toString()), i18n("Check Phishing Url")); break; case WebEngineViewer::CheckPhishingUrlUtil::Ok: break; case WebEngineViewer::CheckPhishingUrlUtil::MalWare: if (!urlIsAMalwareButContinue()) { return; } break; case WebEngineViewer::CheckPhishingUrlUtil::Unknown: qCWarning(AKREGATOR_LOG) << "ArticleViewerWebEngine::slotCheckedUrlFinished unknown error "; break; } openSafeUrl(url); } void ArticleViewerWebEngine::slotLinkClicked(const QUrl &url) { if (URLHandlerWebEngineManager::instance()->handleClick(url, this)) { return; } if (Settings::checkPhishingUrl()) { phishingDatabase()->checkUrl(url); } else { openSafeUrl(url); } } void ArticleViewerWebEngine::openSafeUrl(const QUrl &url) { mCurrentUrl = url; OpenUrlRequest req(mCurrentUrl); if (mLastButtonClicked == LeftButton) { switch (Settings::lMBBehaviour()) { case Settings::EnumLMBBehaviour::OpenInExternalBrowser: req.setOptions(OpenUrlRequest::ExternalBrowser); break; case Settings::EnumLMBBehaviour::OpenInBackground: req.setOpenInBackground(true); req.setOptions(OpenUrlRequest::NewTab); break; default: break; } } else if (mLastButtonClicked == MiddleButton) { switch (Settings::mMBBehaviour()) { case Settings::EnumMMBBehaviour::OpenInExternalBrowser: req.setOptions(OpenUrlRequest::ExternalBrowser); break; case Settings::EnumMMBBehaviour::OpenInBackground: req.setOpenInBackground(true); req.setOptions(OpenUrlRequest::NewTab); break; default: break; } } Q_EMIT signalOpenUrlRequest(req); } void ArticleViewerWebEngine::slotOpenLinkInForegroundTab() { OpenUrlRequest req(mCurrentUrl); req.setOptions(OpenUrlRequest::NewTab); Q_EMIT signalOpenUrlRequest(req); } void ArticleViewerWebEngine::slotOpenLinkInBackgroundTab() { OpenUrlRequest req(mCurrentUrl); req.setOptions(OpenUrlRequest::NewTab); req.setOpenInBackground(true); Q_EMIT signalOpenUrlRequest(req); } void ArticleViewerWebEngine::slotOpenLinkInBrowser() { OpenUrlRequest req(mCurrentUrl); req.setOptions(OpenUrlRequest::ExternalBrowser); Q_EMIT signalOpenUrlRequest(req); } void ArticleViewerWebEngine::createViewerPluginToolManager(KActionCollection *ac, QWidget *parent) { mViewerPluginToolManager = new MessageViewer::ViewerPluginToolManager(parent, this); mViewerPluginToolManager->setActionCollection(ac); mViewerPluginToolManager->setPluginName(QStringLiteral("akregator")); mViewerPluginToolManager->setServiceTypeName(QStringLiteral("Akregator/ViewerPlugin")); if (!mViewerPluginToolManager->initializePluginList()) { qCWarning(AKREGATOR_LOG) << " Impossible to initialize plugins"; } mViewerPluginToolManager->createView(); connect(mViewerPluginToolManager, &MessageViewer::ViewerPluginToolManager::activatePlugin, this, &ArticleViewerWebEngine::slotActivatePlugin); } QList ArticleViewerWebEngine::viewerPluginActionList(MessageViewer::ViewerPluginInterface::SpecificFeatureTypes features) { if (mViewerPluginToolManager) { return mViewerPluginToolManager->viewerPluginActionList(features); } return QList(); } void ArticleViewerWebEngine::slotActivatePlugin(MessageViewer::ViewerPluginInterface *interface) { const QString text = selectedText(); if (!text.isEmpty()) { interface->setText(text); } interface->setUrl(mCurrentUrl); interface->execute(); } diff --git a/src/frame/framemanager.cpp b/src/frame/framemanager.cpp index 41e828f7..a23fb3b9 100644 --- a/src/frame/framemanager.cpp +++ b/src/frame/framemanager.cpp @@ -1,288 +1,288 @@ /* This file is part of Akregator. Copyright (C) 2005 Frank Osterfeld 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 of the License, 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. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. As a special exception, permission is given to link this program with any edition of Qt, and distribute the resulting executable, without including the source code for Qt in the source distribution. */ #include "framemanager.h" #include "akregatorconfig.h" #include "frame.h" #include "actionmanager.h" #include "openurlrequest.h" #include #include #include #include #include #include "akregator_debug.h" #include #include #include using namespace Akregator; FrameManager::FrameManager(QObject *parent) : QObject(parent) , m_currentFrame(nullptr) { } FrameManager::~FrameManager() { } Frame *FrameManager::currentFrame() const { return m_currentFrame; } void FrameManager::slotAddFrame(Frame *frame) { m_frames.insert(frame->id(), frame); connect(frame, &Frame::signalCanceled, this, &FrameManager::slotSetCanceled); connect(frame, &Frame::signalStarted, this, &FrameManager::slotSetStarted); connect(frame, &Frame::signalCaptionChanged, this, &FrameManager::slotSetCaption); connect(frame, &Frame::signalLoadingProgress, this, &FrameManager::slotSetProgress); connect(frame, &Frame::signalCompleted, this, &FrameManager::slotSetCompleted); connect(frame, &Frame::signalTitleChanged, this, &FrameManager::slotSetTitle); connect(frame, &Frame::signalStatusText, this, &FrameManager::slotSetStatusText); connect(frame, &Frame::signalOpenUrlRequest, this, [this](OpenUrlRequest &request) { slotOpenUrlRequest(request); }); //setPartGuiActive(frame->part(), false); Q_EMIT signalFrameAdded(frame); if (m_frames.count() == 1) { slotChangeFrame(frame->id()); } } void FrameManager::slotRemoveFrame(int id) { Frame *frame = m_frames.value(id); if (!frame || !frame->isRemovable()) { return; } frame->disconnect(this); if (m_currentFrame == frame) { slotChangeFrame(-1); } m_frames.insert(id, 0); m_frames.remove(id); Q_EMIT signalFrameRemoved(id); delete frame; } Frame *FrameManager::findFrameById(int id) const { return m_frames.value(id); } void FrameManager::slotChangeFrame(int frameId) { Frame *frame = m_frames.value(frameId); if (frame == m_currentFrame) { return; } Frame *oldFrame = m_currentFrame; m_currentFrame = frame; //if (oldFrame) { // setPartGuiActive(oldFrame->part(), false); //} if (frame) { //setPartGuiActive(frame->part(), true); // TODO: handle removable flag switch (frame->state()) { case Frame::Started: Q_EMIT signalStarted(); break; case Frame::Canceled: Q_EMIT signalCanceled(QString()); break; case Frame::Idle: case Frame::Completed: Q_EMIT signalCompleted(); } Q_EMIT signalCaptionChanged(frame->caption()); Q_EMIT signalTitleChanged(frame->title()); Q_EMIT signalLoadingProgress(frame->progress()); Q_EMIT signalStatusText(frame->statusText()); } else { Q_EMIT signalCompleted(); Q_EMIT signalCaptionChanged(QString()); Q_EMIT signalTitleChanged(QString()); Q_EMIT signalLoadingProgress(100); Q_EMIT signalStatusText(QString()); } Q_EMIT signalCurrentFrameChanged(oldFrame, frame); } void FrameManager::slotSetStarted(Frame *frame) { if (frame == m_currentFrame) { Q_EMIT signalStarted(); } } void FrameManager::slotSetCanceled(Frame *frame, const QString &reason) { if (frame == m_currentFrame) { Q_EMIT signalCanceled(reason); } } void FrameManager::slotSetCompleted(Frame *frame) { if (frame == m_currentFrame) { Q_EMIT signalCompleted(); } } void FrameManager::slotSetProgress(Frame *frame, int progress) { if (frame == m_currentFrame) { Q_EMIT signalLoadingProgress(progress); } } void FrameManager::slotSetCaption(Frame *frame, const QString &caption) { if (frame == m_currentFrame) { Q_EMIT signalCaptionChanged(caption); } } void FrameManager::slotSetTitle(Frame *frame, const QString &title) { if (frame == m_currentFrame) { Q_EMIT signalTitleChanged(title); } } void FrameManager::slotSetStatusText(Frame *frame, const QString &statusText) { if (frame == m_currentFrame) { Q_EMIT signalStatusText(statusText); } } void FrameManager::openUrl(OpenUrlRequest &request) { if (request.browserArgs().newTab() || request.browserArgs().forcesNewWindow() || request.options() == OpenUrlRequest::NewTab || (m_currentFrame->id() == 0)) { int newFrameId = -1; Q_EMIT signalRequestNewFrame(newFrameId); request.setFrameId(newFrameId); } else { request.setFrameId(m_currentFrame->id()); } if (m_frames.contains(request.frameId())) { Frame *frame = m_frames.value(request.frameId()); if (frame->openUrl(request)) { request.setWasHandled(true); } } if (!request.openInBackground()) { Q_EMIT signalSelectFrame(request.frameId()); } } void FrameManager::openInExternalBrowser(const OpenUrlRequest &request) { QUrl url = request.url(); if (!url.isValid()) { return; } if (!Settings::externalBrowserUseKdeDefault()) { QHash map; map.insert(QLatin1Char('u'), url.url()); const QString cmd = KMacroExpander::expandMacrosShellQuote(Settings::externalBrowserCustomCommand(), map); const QStringList args = KShell::splitArgs(cmd); if (!args.isEmpty()) { KProcess::startDetached(args); return; } } if (request.args().mimeType().isEmpty()) { QDesktopServices::openUrl(url); } else { - KRun::RunFlags flag = 0; + KRun::RunFlags flag = {}; KRun::runUrl(url, request.args().mimeType(), nullptr /*window*/, flag); } } void FrameManager::slotOpenUrlRequest(OpenUrlRequest &request, bool useOpenInBackgroundSetting) { qCDebug(AKREGATOR_LOG) << "FrameManager::slotOpenUrlRequest():" << request.debugInfo(); if (request.options() == OpenUrlRequest::ExternalBrowser) { openInExternalBrowser(request); return; } if (useOpenInBackgroundSetting) { // Honour user's preference for foreground/background tabs if (request.options() == OpenUrlRequest::NewTab || request.browserArgs().newTab()) { request.setOpenInBackground(Settings::lMBBehaviour() == Settings::EnumLMBBehaviour::OpenInBackground); } } openUrl(request); } void FrameManager::saveProperties(KConfigGroup &config) { //write children QStringList strlst; QHash::const_iterator i; QHash::const_iterator end(m_frames.constEnd()); for (i = m_frames.constBegin(); i != end; ++i) { // No need to save the main frame Frame *currentFrame = i.value(); if (currentFrame && qobject_cast(currentFrame)) { QString newPrefix = QLatin1Char('T') + QString::number(i.key()); if (currentFrame->saveConfig(config, newPrefix + QLatin1Char('_'))) { strlst.append(newPrefix); if (currentFrame == m_currentFrame) { config.writeEntry(QStringLiteral("CurrentTab"), newPrefix); } } } } config.writeEntry(QStringLiteral("Children"), strlst); }