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 "webengineframe.h"
8 #include "akrwebengineviewer.h"
9 #include "articleviewer-ng/webengine/articleviewerwebenginewidgetng.h"
10 
11 #include <KIO/FavIconRequestJob>
12 
13 #include <QVBoxLayout>
14 
15 using namespace Akregator;
16 
WebEngineFrame(KActionCollection * ac,QWidget * parent)17 WebEngineFrame::WebEngineFrame(KActionCollection *ac, QWidget *parent)
18     : Frame(parent)
19 {
20     auto layout = new QVBoxLayout(this);
21     layout->setContentsMargins({});
22     setRemovable(true);
23     auto viewer = new Akregator::AkrWebEngineViewer(ac, this);
24     mArticleViewerWidgetNg = new Akregator::ArticleViewerWebEngineWidgetNg(viewer, ac, this);
25 
26     connect(mArticleViewerWidgetNg->articleViewerNg(), &ArticleViewerWebEngine::titleChanged, this, &WebEngineFrame::slotTitleChanged);
27 
28     connect(mArticleViewerWidgetNg->articleViewerNg(), &ArticleViewerWebEngine::loadProgress, this, &WebEngineFrame::slotProgressChanged);
29 
30     connect(mArticleViewerWidgetNg->articleViewerNg(), &ArticleViewerWebEngine::signalOpenUrlRequest, this, &WebEngineFrame::signalOpenUrlRequest);
31 
32     connect(mArticleViewerWidgetNg->articleViewerNg(), &ArticleViewerWebEngine::loadStarted, this, &WebEngineFrame::slotLoadStarted);
33 
34     connect(mArticleViewerWidgetNg->articleViewerNg(), &ArticleViewerWebEngine::loadFinished, this, &WebEngineFrame::slotLoadFinished);
35 
36     connect(mArticleViewerWidgetNg->articleViewerNg(), &ArticleViewerWebEngine::showStatusBarMessage, this, &WebEngineFrame::showStatusBarMessage);
37 
38     connect(mArticleViewerWidgetNg->articleViewerNg(),
39             &ArticleViewerWebEngine::webPageMutedOrAudibleChanged,
40             this,
41             &WebEngineFrame::slotWebPageMutedOrAudibleChanged);
42 
43     layout->addWidget(mArticleViewerWidgetNg);
44 }
45 
~WebEngineFrame()46 WebEngineFrame::~WebEngineFrame()
47 {
48 }
49 
slotWebPageMutedOrAudibleChanged(bool isAudioMuted,bool wasRecentlyAudible)50 void WebEngineFrame::slotWebPageMutedOrAudibleChanged(bool isAudioMuted, bool wasRecentlyAudible)
51 {
52     Q_EMIT webPageMutedOrAudibleChanged(this, isAudioMuted, wasRecentlyAudible);
53 }
54 
slotLoadFinished()55 void WebEngineFrame::slotLoadFinished()
56 {
57     Q_EMIT signalCompleted(this);
58 }
59 
slotLoadStarted()60 void WebEngineFrame::slotLoadStarted()
61 {
62     Q_EMIT signalStarted(this);
63 }
64 
slotProgressChanged(int progress)65 void WebEngineFrame::slotProgressChanged(int progress)
66 {
67     Q_EMIT signalLoadingProgress(this, progress);
68 }
69 
slotTitleChanged(const QString & title)70 void WebEngineFrame::slotTitleChanged(const QString &title)
71 {
72     slotSetTitle(title);
73 }
74 
url() const75 QUrl WebEngineFrame::url() const
76 {
77     return mArticleViewerWidgetNg->articleViewerNg()->url();
78 }
79 
loadUrl(const QUrl & url)80 void WebEngineFrame::loadUrl(const QUrl &url)
81 {
82     auto job = new KIO::FavIconRequestJob(url);
83     connect(job, &KIO::FavIconRequestJob::result, this, [job, this](KJob *) {
84         if (!job->error()) {
85             Q_EMIT signalIconChanged(this, QIcon(job->iconFile()));
86         }
87     });
88 
89     mArticleViewerWidgetNg->articleViewerNg()->load(url);
90 }
91 
openUrl(const OpenUrlRequest & request)92 bool WebEngineFrame::openUrl(const OpenUrlRequest &request)
93 {
94     const QUrl url = request.url();
95     loadUrl(url);
96     return true;
97 }
98 
loadConfig(const KConfigGroup & config,const QString & prefix)99 void WebEngineFrame::loadConfig(const KConfigGroup &config, const QString &prefix)
100 {
101     const QString url = config.readEntry(QStringLiteral("url").prepend(prefix), QString());
102     const qreal zf = config.readEntry(QStringLiteral("zoom").prepend(prefix), 1.0);
103     mArticleViewerWidgetNg->articleViewerNg()->setZoomFactor(zf);
104     loadUrl(QUrl(url));
105 }
106 
saveConfig(KConfigGroup & config,const QString & prefix)107 bool WebEngineFrame::saveConfig(KConfigGroup &config, const QString &prefix)
108 {
109     const QString urlPath(url().url());
110     if (urlPath != QLatin1String("about:blank")) {
111         config.writeEntry(QStringLiteral("url").prepend(prefix), urlPath);
112         config.writeEntry(QStringLiteral("zoom").prepend(prefix), zoomFactor());
113         return true;
114     } else {
115         return false;
116     }
117 }
118 
slotCopyInFrame(int frameId)119 void WebEngineFrame::slotCopyInFrame(int frameId)
120 {
121     if (frameId != id()) {
122         return;
123     }
124     mArticleViewerWidgetNg->articleViewerNg()->slotCopy();
125 }
126 
slotPrintInFrame(int frameId)127 void WebEngineFrame::slotPrintInFrame(int frameId)
128 {
129     if (frameId != id()) {
130         return;
131     }
132     mArticleViewerWidgetNg->slotPrint();
133 }
134 
slotPrintPreviewInFrame(int frameId)135 void WebEngineFrame::slotPrintPreviewInFrame(int frameId)
136 {
137     if (frameId != id()) {
138         return;
139     }
140     mArticleViewerWidgetNg->slotPrintPreview();
141 }
142 
slotFindTextInFrame(int frameId)143 void WebEngineFrame::slotFindTextInFrame(int frameId)
144 {
145     if (frameId != id()) {
146         return;
147     }
148     mArticleViewerWidgetNg->slotFind();
149 }
150 
slotTextToSpeechInFrame(int frameId)151 void WebEngineFrame::slotTextToSpeechInFrame(int frameId)
152 {
153     if (frameId != id()) {
154         return;
155     }
156     mArticleViewerWidgetNg->slotSpeakText();
157 }
158 
slotZoomChangeInFrame(int frameId,qreal value)159 void WebEngineFrame::slotZoomChangeInFrame(int frameId, qreal value)
160 {
161     if (frameId != id()) {
162         return;
163     }
164     mArticleViewerWidgetNg->articleViewerNg()->setZoomFactor(value);
165 }
166 
slotReload()167 void WebEngineFrame::slotReload()
168 {
169     mArticleViewerWidgetNg->articleViewerNg()->reload();
170 }
171 
slotStop()172 void WebEngineFrame::slotStop()
173 {
174     mArticleViewerWidgetNg->articleViewerNg()->stop();
175 }
176 
zoomFactor() const177 qreal WebEngineFrame::zoomFactor() const
178 {
179     return mArticleViewerWidgetNg->articleViewerNg()->zoomFactor();
180 }
181 
slotSaveLinkAsInFrame(int frameId)182 void WebEngineFrame::slotSaveLinkAsInFrame(int frameId)
183 {
184     if (frameId != id()) {
185         return;
186     }
187     mArticleViewerWidgetNg->articleViewerNg()->slotSaveLinkAs();
188 }
189 
slotCopyLinkAsInFrame(int frameId)190 void WebEngineFrame::slotCopyLinkAsInFrame(int frameId)
191 {
192     if (frameId != id()) {
193         return;
194     }
195     mArticleViewerWidgetNg->articleViewerNg()->slotCopyLinkAddress();
196 }
197 
slotSaveImageOnDiskInFrame(int frameId)198 void WebEngineFrame::slotSaveImageOnDiskInFrame(int frameId)
199 {
200     if (frameId != id()) {
201         return;
202     }
203     mArticleViewerWidgetNg->articleViewerNg()->slotSaveImageOnDiskInFrame();
204 }
205 
slotCopyImageLocationInFrame(int frameId)206 void WebEngineFrame::slotCopyImageLocationInFrame(int frameId)
207 {
208     if (frameId != id()) {
209         return;
210     }
211     mArticleViewerWidgetNg->articleViewerNg()->slotCopyImageLocationInFrame();
212 }
213 
slotMute(int frameId,bool mute)214 void WebEngineFrame::slotMute(int frameId, bool mute)
215 {
216     if (frameId != id()) {
217         return;
218     }
219     mArticleViewerWidgetNg->articleViewerNg()->slotMute(mute);
220 }
221