1 /*
2 SPDX-FileCopyrightText: 2016-2021 Laurent Montel <montel@kde.org>
3
4 SPDX-License-Identifier: GPL-2.0-or-later
5 */
6
7 #include "urlhandlerwebengine.h"
8 #include "akregator_debug.h"
9 #include "articleviewer-ng/webengine/articleviewerwebengine.h"
10 #include <KEmailAddress>
11 #include <KLocalizedString>
12 #include <PimCommon/BroadcastStatus>
13 #include <QApplication>
14 #include <QClipboard>
15 #include <QDesktopServices>
16 #include <QMenu>
17 #include <QUrlQuery>
18 using namespace Akregator;
19
handleClick(const QUrl & url,ArticleViewerWebEngine * article) const20 bool AkregatorConfigHandler::handleClick(const QUrl &url, ArticleViewerWebEngine *article) const
21 {
22 if (url.scheme() == QLatin1String("config")) {
23 if (url.path() == QLatin1String("/disable_introduction")) {
24 article->disableIntroduction();
25 return true;
26 }
27 }
28 return false;
29 }
30
handleContextMenuRequest(const QUrl & url,const QPoint &,ArticleViewerWebEngine *) const31 bool AkregatorConfigHandler::handleContextMenuRequest(const QUrl &url, const QPoint &, ArticleViewerWebEngine *) const
32 {
33 return url.scheme() == QLatin1String("config");
34 }
35
statusBarMessage(const QUrl & url,ArticleViewerWebEngine *) const36 QString AkregatorConfigHandler::statusBarMessage(const QUrl &url, ArticleViewerWebEngine *) const
37 {
38 if (url.scheme() == QLatin1String("config")) {
39 if (url.path() == QLatin1String("/disable_introduction")) {
40 return i18n("Disable Introduction");
41 }
42 }
43 return {};
44 }
45
statusBarMessage(const QUrl & url,ArticleViewerWebEngine *) const46 QString MailToURLHandlerWebEngine::statusBarMessage(const QUrl &url, ArticleViewerWebEngine *) const
47 {
48 if (url.scheme() == QLatin1String("mailto")) {
49 return KEmailAddress::decodeMailtoUrl(url);
50 }
51 return QString();
52 }
53
handleContextMenuRequest(const QUrl & url,const QPoint & p,ArticleViewerWebEngine *) const54 bool MailToURLHandlerWebEngine::handleContextMenuRequest(const QUrl &url, const QPoint &p, ArticleViewerWebEngine *) const
55 {
56 if (url.scheme() == QLatin1String("mailto")) {
57 auto menu = new QMenu();
58 QAction *copy = menu->addAction(QIcon::fromTheme(QStringLiteral("edit-copy")), i18n("&Copy Email Address"));
59
60 QAction *a = menu->exec(p);
61 if (a == copy) {
62 const QString fullEmail = KEmailAddress::decodeMailtoUrl(url);
63 if (!fullEmail.isEmpty()) {
64 QClipboard *clip = QApplication::clipboard();
65 clip->setText(fullEmail, QClipboard::Clipboard);
66 clip->setText(fullEmail, QClipboard::Selection);
67 PimCommon::BroadcastStatus::instance()->setStatusMsg(i18n("Address copied to clipboard."));
68 }
69 }
70 delete menu;
71
72 return true;
73 }
74 return false;
75 }
76
handleClick(const QUrl & url,ArticleViewerWebEngine *) const77 bool MailToURLHandlerWebEngine::handleClick(const QUrl &url, ArticleViewerWebEngine *) const
78 {
79 if (url.scheme() == QLatin1String("mailto")) {
80 QDesktopServices::openUrl(url);
81 return true;
82 }
83 return false;
84 }
85
handleContextMenuRequest(const QUrl & url,const QPoint &,ArticleViewerWebEngine *) const86 bool ActionURLHandlerWebEngine::handleContextMenuRequest(const QUrl &url, const QPoint &, ArticleViewerWebEngine *) const
87 {
88 return url.scheme() == QLatin1String("akregatoraction");
89 }
90
statusBarMessage(const QUrl & url,ArticleViewerWebEngine *) const91 QString ActionURLHandlerWebEngine::statusBarMessage(const QUrl &url, ArticleViewerWebEngine *) const
92 {
93 if (url.scheme() == QLatin1String("akregatoraction")) {
94 const QString urlPath(url.path());
95 if (urlPath == QLatin1String("delete")) {
96 return i18n("Delete Article");
97 } else if (urlPath == QLatin1String("markAsRead")) {
98 return i18n("Mark Article as Read");
99 } else if (urlPath == QLatin1String("markAsUnRead")) {
100 return i18n("Mark Article as Unread");
101 } else if (urlPath == QLatin1String("markAsImportant")) {
102 return i18n("Change Important Flag");
103 } else if (urlPath == QLatin1String("sendUrlArticle")) {
104 return i18n("Send the URL of the article");
105 } else if (urlPath == QLatin1String("sendFileArticle")) {
106 return i18n("Send the Html Page of Article");
107 } else if (urlPath == QLatin1String("openInExternalBrowser")) {
108 return i18n("Open In External Browser");
109 } else if (urlPath == QLatin1String("openInBackgroundTab")) {
110 return i18n("Open In Background Tab");
111 }
112 return {};
113 }
114 return {};
115 }
116
handleClick(const QUrl & url,ArticleViewerWebEngine * articleViewer) const117 bool ActionURLHandlerWebEngine::handleClick(const QUrl &url, ArticleViewerWebEngine *articleViewer) const
118 {
119 if (url.scheme() == QLatin1String("akregatoraction")) {
120 const QString urlPath(url.path());
121 if (url.hasQuery()) {
122 const QUrlQuery urlQuery(url);
123 const QString articleId = urlQuery.queryItemValue(QStringLiteral("id"));
124 const QString feed = urlQuery.queryItemValue(QStringLiteral("feed"));
125 if (!articleId.isEmpty()) {
126 if (urlPath == QLatin1String("delete")) {
127 articleViewer->setArticleAction(ArticleViewerWebEngine::DeleteAction, articleId, feed);
128 return true;
129 } else if (urlPath == QLatin1String("markAsRead")) {
130 articleViewer->setArticleAction(ArticleViewerWebEngine::MarkAsRead, articleId, feed);
131 return true;
132 } else if (urlPath == QLatin1String("markAsUnRead")) {
133 articleViewer->setArticleAction(ArticleViewerWebEngine::MarkAsUnRead, articleId, feed);
134 return true;
135 } else if (urlPath == QLatin1String("markAsImportant")) {
136 articleViewer->setArticleAction(ArticleViewerWebEngine::MarkAsImportant, articleId, feed);
137 return true;
138 } else if (urlPath == QLatin1String("sendUrlArticle")) {
139 articleViewer->setArticleAction(ArticleViewerWebEngine::SendUrlArticle, articleId, feed);
140 return true;
141 } else if (urlPath == QLatin1String("sendFileArticle")) {
142 articleViewer->setArticleAction(ArticleViewerWebEngine::SendFileArticle, articleId, feed);
143 return true;
144 } else if (urlPath == QLatin1String("openInExternalBrowser")) {
145 articleViewer->setArticleAction(ArticleViewerWebEngine::OpenInExternalBrowser, articleId, feed);
146 return true;
147 } else if (urlPath == QLatin1String("openInBackgroundTab")) {
148 articleViewer->setArticleAction(ArticleViewerWebEngine::OpenInBackgroundTab, articleId, feed);
149 return true;
150 }
151 }
152 } else {
153 qCWarning(AKREGATOR_LOG) << "Undefined article id";
154 return true;
155 }
156 }
157 return false;
158 }
159