6#include "mailwebengineview.h"
7#include "../urlhandlermanager.h"
8#include "cidreferencesurlinterceptor/cidreferencesurlinterceptor.h"
9#include "cidschemehandler/cidschemehandler.h"
10#include "loadexternalreferencesurlinterceptor/loadexternalreferencesurlinterceptor.h"
11#include "mailwebenginepage.h"
12#include "messageviewer/messageviewersettings.h"
13#include "webengineviewer/webengineaccesskey.h"
14#include "webengineviewer/webenginescript.h"
15#include <WebEngineViewer/BlockExternalResourcesUrlInterceptor>
16#include <WebEngineViewer/InterceptorManager>
17#include <WebEngineViewer/WebEngineManageScript>
19#include "scamdetection/scamdetectionwebengine.h"
20#include <QContextMenuEvent>
21#include <QWebEngineProfile>
22#include <WebEngineViewer/WebHitTest>
26#include <QWebEngineUrlScheme>
28#include <WebEngineViewer/WebHitTestResult>
30using namespace MessageViewer;
31template<
typename Arg,
typename R,
typename C>
34 void (C::*memberFunction)(Arg);
35 void operator()(Arg result)
37 (receiver->*memberFunction)(result);
41template<
typename Arg,
typename R,
typename C>
43InvokeWrapper<Arg, R, C> invoke(R *receiver,
void (C::*memberFunction)(Arg))
45 InvokeWrapper<Arg, R, C> wrapper = {receiver, memberFunction};
49class MessageViewer::MailWebEngineViewPrivate
52 MailWebEngineViewPrivate() =
default;
58 MessageViewer::LoadExternalReferencesUrlInterceptor *mExternalReference =
nullptr;
61 MessageViewer::ViewerPrivate *mViewer =
nullptr;
63 bool mCanStartDrag =
false;
67 : WebEngineViewer::WebEngineView(parent)
68 , d(new MessageViewer::MailWebEngineViewPrivate)
71 setPage(d->mPageEngine);
73 d->mWebViewAccessKey->setActionCollection(ac);
75 connect(d->mScamDetection, &ScamDetectionWebEngine::messageMayBeAScam,
this, &MailWebEngineView::messageMayBeAScam);
76 connect(d->mWebViewAccessKey, &WebEngineViewer::WebEngineAccessKey::openUrl,
this, &MailWebEngineView::openUrl);
77 connect(
this, &MailWebEngineView::loadFinished,
this, &MailWebEngineView::slotLoadFinished);
79 d->mPageEngine->profile()->installUrlSchemeHandler(QByteArrayLiteral(
"cid"),
new CidSchemeHandler(
this));
82 d->mExternalReference =
new MessageViewer::LoadExternalReferencesUrlInterceptor(
this);
83 connect(d->mExternalReference, &MessageViewer::LoadExternalReferencesUrlInterceptor::urlBlocked,
this, &MailWebEngineView::urlBlocked);
84 d->mNetworkAccessManager->addInterceptor(d->mExternalReference);
85 auto cidReference =
new MessageViewer::CidReferencesUrlInterceptor(
this);
86 d->mNetworkAccessManager->addInterceptor(cidReference);
87 auto blockExternalUrl =
new WebEngineViewer::BlockExternalResourcesUrlInterceptor(
this);
88 connect(blockExternalUrl, &WebEngineViewer::BlockExternalResourcesUrlInterceptor::formSubmittedForbidden,
this, &MailWebEngineView::formSubmittedForbidden);
89 d->mNetworkAccessManager->addInterceptor(blockExternalUrl);
92 connect(d->mBlockMailTrackingUrl, &WebEngineViewer::BlockTrackingUrlInterceptor::trackingFound,
this, &MailWebEngineView::mailTrackingFound);
93 d->mNetworkAccessManager->addInterceptor(d->mBlockMailTrackingUrl);
96 connect(d->mPageEngine, &MailWebEnginePage::urlClicked,
this, &MailWebEngineView::openUrl);
97 connect(page(), &QWebEnginePage::scrollPositionChanged, d->mWebViewAccessKey, &WebEngineViewer::WebEngineAccessKey::hideAccessKeys);
100MailWebEngineView::~MailWebEngineView() =
default;
102void MailWebEngineView::readConfig()
104 d->mBlockMailTrackingUrl->setEnabledMailTrackingInterceptor(MessageViewer::MessageViewerSettings::self()->mailTrackingUrlEnabled());
107void MailWebEngineView::setLinkHovered(
const QUrl &url)
110 d->mHoveredUrl = url;
113void MailWebEngineView::runJavaScriptInWordId(
const QString &script)
115 page()->runJavaScript(script, WebEngineViewer::WebEngineManageScript::scriptWordId());
118void MailWebEngineView::setViewer(MessageViewer::ViewerPrivate *viewer)
126 connect(webHit, &WebEngineViewer::WebHitTest::finished,
this, &MailWebEngineView::slotWebHitFinished);
134void MailWebEngineView::scrollUp(
int pixels)
136 runJavaScriptInWordId(WebEngineViewer::WebEngineScript::scrollUp(pixels));
139void MailWebEngineView::scrollDown(
int pixels)
141 runJavaScriptInWordId(WebEngineViewer::WebEngineScript::scrollDown(pixels));
144void MailWebEngineView::selectAll()
146 page()->triggerAction(QWebEnginePage::SelectAll);
149void MailWebEngineView::slotZoomChanged(qreal zoom)
154void MailWebEngineView::scamCheck()
156 d->mScamDetection->scanPage(page());
159void MailWebEngineView::slotShowDetails()
161 d->mScamDetection->showDetails();
164void MailWebEngineView::forwardKeyReleaseEvent(
QKeyEvent *e)
166 if (MessageViewer::MessageViewerSettings::self()->accessKeyEnabled()) {
167 d->mWebViewAccessKey->keyReleaseEvent(e);
171void MailWebEngineView::forwardMousePressEvent(
QMouseEvent *event)
173 if (d->mViewer && !d->mHoveredUrl.isEmpty()) {
176 if (URLHandlerManager::instance()->handleShiftClick(d->mHoveredUrl, d->mViewer)) {
182 d->mCanStartDrag = URLHandlerManager::instance()->willHandleDrag(d->mHoveredUrl, d->mViewer);
183 d->mLastClickPosition =
event->pos();
188void MailWebEngineView::forwardMouseMoveEvent(
QMouseEvent *event)
190 if (d->mViewer && !d->mHoveredUrl.isEmpty()) {
194 if (URLHandlerManager::instance()->handleDrag(d->mHoveredUrl, d->mViewer)) {
196 d->mCanStartDrag =
false;
204void MailWebEngineView::forwardMouseReleaseEvent(
QMouseEvent *event)
207 d->mCanStartDrag =
false;
210void MailWebEngineView::forwardKeyPressEvent(
QKeyEvent *e)
212 if (e && hasFocus()) {
213 if (MessageViewer::MessageViewerSettings::self()->accessKeyEnabled()) {
214 d->mWebViewAccessKey->keyPressEvent(e);
219void MailWebEngineView::forwardWheelEvent(
QWheelEvent *e)
221 if (MessageViewer::MessageViewerSettings::self()->accessKeyEnabled()) {
222 d->mWebViewAccessKey->wheelEvent(e);
226 const int numSteps = numDegrees / 15;
227 Q_EMIT wheelZoomChanged(numSteps);
234 if (MessageViewer::MessageViewerSettings::self()->accessKeyEnabled()) {
235 d->mWebViewAccessKey->resizeEvent(e);
237 QWebEngineView::resizeEvent(e);
240void MailWebEngineView::saveMainFrameScreenshotInFile(
const QString &filename)
252 image.save(filename);
255void MailWebEngineView::showAccessKeys()
257 d->mWebViewAccessKey->showAccessKeys();
260void MailWebEngineView::hideAccessKeys()
262 d->mWebViewAccessKey->hideAccessKeys();
265void MailWebEngineView::isScrolledToBottom()
267 page()->runJavaScript(WebEngineViewer::WebEngineScript::isScrolledToBottom(),
268 WebEngineViewer::WebEngineManageScript::scriptWordId(),
269 invoke(
this, &MailWebEngineView::handleIsScrolledToBottom));
272void MailWebEngineView::setElementByIdVisible(
const QString &
id,
bool visible)
274 runJavaScriptInWordId(WebEngineViewer::WebEngineScript::setElementByIdVisible(
id, visible));
277void MailWebEngineView::removeAttachmentMarking(
const QString &
id)
279 runJavaScriptInWordId(WebEngineViewer::WebEngineScript::removeStyleToElement(
id));
282void MailWebEngineView::markAttachment(
const QString &
id,
const QString &style)
284 runJavaScriptInWordId(WebEngineViewer::WebEngineScript::setStyleToElement(
id, style));
287void MailWebEngineView::scrollToAnchor(
const QString &anchor)
289 page()->runJavaScript(WebEngineViewer::WebEngineScript::searchElementPosition(anchor),
290 WebEngineViewer::WebEngineManageScript::scriptWordId(),
291 invoke(
this, &MailWebEngineView::handleScrollToAnchor));
294void MailWebEngineView::handleIsScrolledToBottom(
const QVariant &result)
296 bool scrolledToBottomResult =
false;
298 scrolledToBottomResult = result.
toBool();
300 Q_EMIT pageIsScrolledToBottom(scrolledToBottomResult);
303void MailWebEngineView::handleScrollToAnchor(
const QVariant &result)
307 if (lst.
count() == 2) {
308 const QPoint pos(lst.
at(0).toInt(), lst.
at(1).toInt());
309 runJavaScriptInWordId(WebEngineViewer::WebEngineScript::scrollToPosition(pos));
314void MailWebEngineView::scrollPageDown(
int percent)
316 runJavaScriptInWordId(WebEngineViewer::WebEngineScript::scrollPercentage(percent));
319void MailWebEngineView::scrollPageUp(
int percent)
321 scrollPageDown(-percent);
324void MailWebEngineView::scrollToRelativePosition(qreal pos)
326 runJavaScriptInWordId(WebEngineViewer::WebEngineScript::scrollToRelativePosition(pos));
329void MailWebEngineView::setAllowExternalContent(
bool b)
331 if (d->mExternalReference->allowExternalContent() != b) {
332 d->mExternalReference->setAllowExternalContent(b);
339 return d->mNetworkAccessManager->interceptorUrlActions(result);
342void MailWebEngineView::slotLoadFinished()
347void MailWebEngineView::setPrintElementBackground(
bool printElementBackground)
349 d->mPageEngine->setPrintElementBackground(printElementBackground);
352void MailWebEngineView::printPreviewPage(
QPrinter *printer)
357void MailWebEngineView::initializeCustomScheme()
359 QWebEngineUrlScheme cidScheme(
"cid");
360 cidScheme.setFlags(QWebEngineUrlScheme::SecureScheme | QWebEngineUrlScheme::ContentSecurityPolicyIgnored | QWebEngineUrlScheme::LocalScheme
361 | QWebEngineUrlScheme::LocalAccessAllowed);
362 cidScheme.setSyntax(QWebEngineUrlScheme::Syntax::Path);
363 QWebEngineUrlScheme::registerScheme(cidScheme);
366#include "moc_mailwebengineview.cpp"
The MailWebEnginePage class.
void popupMenu(const WebEngineViewer::WebHitTestResult &result)
Emitted when the user right-clicks somewhere.
The ScamDetectionWebEngine class.
The BlockMailTrackingUrlInterceptor class.
The InterceptorManager class.
The WebEngineAccessKey class.
The WebHitTestResult class.
AKONADI_CALENDAR_EXPORT KCalendarCore::Event::Ptr event(const Akonadi::Item &item)
const QList< QKeySequence > & reload()
const QList< QKeySequence > & print()
Qt::KeyboardModifiers keyboardModifiers()
const_reference at(qsizetype i) const const
qsizetype count() const const
QFuture< ArgsType< Signal > > connect(Sender *sender, Signal signal)
bool isValid() const const
bool toBool() const const
QList< QVariant > toList() const const
QPoint angleDelta() const const