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