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>
30 using namespace MessageViewer;
31 template<
typename Arg,
typename R,
typename C>
32 struct InvokeWrapper {
34 void (C::*memberFunction)(Arg);
35 void operator()(Arg result)
37 (receiver->*memberFunction)(result);
41 template<
typename Arg,
typename R,
typename C>
43 InvokeWrapper<Arg, R, C> invoke(R *receiver,
void (C::*memberFunction)(Arg))
45 InvokeWrapper<Arg, R, C> wrapper = {receiver, memberFunction};
49 class 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);
100 MailWebEngineView::~MailWebEngineView() =
default;
102 void MailWebEngineView::readConfig()
104 d->mBlockMailTrackingUrl->setEnabledMailTrackingInterceptor(MessageViewer::MessageViewerSettings::self()->mailTrackingUrlEnabled());
107 void MailWebEngineView::setLinkHovered(
const QUrl &url)
110 d->mHoveredUrl = url;
113 void MailWebEngineView::runJavaScriptInWordId(
const QString &script)
115 page()->runJavaScript(script, WebEngineViewer::WebEngineManageScript::scriptWordId());
118 void MailWebEngineView::setViewer(MessageViewer::ViewerPrivate *viewer)
126 connect(webHit, &WebEngineViewer::WebHitTest::finished,
this, &MailWebEngineView::slotWebHitFinished);
134 void MailWebEngineView::scrollUp(
int pixels)
136 runJavaScriptInWordId(WebEngineViewer::WebEngineScript::scrollUp(pixels));
139 void MailWebEngineView::scrollDown(
int pixels)
141 runJavaScriptInWordId(WebEngineViewer::WebEngineScript::scrollDown(pixels));
144 void MailWebEngineView::selectAll()
146 page()->triggerAction(QWebEnginePage::SelectAll);
149 void MailWebEngineView::slotZoomChanged(qreal zoom)
154 void MailWebEngineView::scamCheck()
156 d->mScamDetection->scanPage(page());
159 void MailWebEngineView::slotShowDetails()
161 d->mScamDetection->showDetails();
164 void MailWebEngineView::forwardKeyReleaseEvent(
QKeyEvent *e)
166 if (MessageViewer::MessageViewerSettings::self()->accessKeyEnabled()) {
167 d->mWebViewAccessKey->keyReleaseEvent(e);
171 void 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();
188 void MailWebEngineView::forwardMouseMoveEvent(
QMouseEvent *event)
190 if (d->mViewer && !d->mHoveredUrl.isEmpty()) {
194 if (URLHandlerManager::instance()->handleDrag(d->mHoveredUrl, d->mViewer)) {
196 d->mCanStartDrag =
false;
204 void MailWebEngineView::forwardMouseReleaseEvent(
QMouseEvent *event)
207 d->mCanStartDrag =
false;
210 void MailWebEngineView::forwardKeyPressEvent(
QKeyEvent *e)
212 if (e && hasFocus()) {
213 if (MessageViewer::MessageViewerSettings::self()->accessKeyEnabled()) {
214 d->mWebViewAccessKey->keyPressEvent(e);
219 void 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);
240 void MailWebEngineView::saveMainFrameScreenshotInFile(
const QString &filename)
252 image.save(filename);
255 void MailWebEngineView::showAccessKeys()
257 d->mWebViewAccessKey->showAccessKeys();
260 void MailWebEngineView::hideAccessKeys()
262 d->mWebViewAccessKey->hideAccessKeys();
265 void MailWebEngineView::isScrolledToBottom()
267 page()->runJavaScript(WebEngineViewer::WebEngineScript::isScrolledToBottom(),
268 WebEngineViewer::WebEngineManageScript::scriptWordId(),
269 invoke(
this, &MailWebEngineView::handleIsScrolledToBottom));
272 void MailWebEngineView::setElementByIdVisible(
const QString &
id,
bool visible)
274 runJavaScriptInWordId(WebEngineViewer::WebEngineScript::setElementByIdVisible(
id, visible));
277 void MailWebEngineView::removeAttachmentMarking(
const QString &
id)
279 runJavaScriptInWordId(WebEngineViewer::WebEngineScript::removeStyleToElement(
id));
282 void MailWebEngineView::markAttachment(
const QString &
id,
const QString &style)
284 runJavaScriptInWordId(WebEngineViewer::WebEngineScript::setStyleToElement(
id, style));
287 void MailWebEngineView::scrollToAnchor(
const QString &anchor)
289 page()->runJavaScript(WebEngineViewer::WebEngineScript::searchElementPosition(anchor),
290 WebEngineViewer::WebEngineManageScript::scriptWordId(),
291 invoke(
this, &MailWebEngineView::handleScrollToAnchor));
294 void MailWebEngineView::handleIsScrolledToBottom(
const QVariant &result)
296 bool scrolledToBottomResult =
false;
298 scrolledToBottomResult = result.
toBool();
300 Q_EMIT pageIsScrolledToBottom(scrolledToBottomResult);
303 void 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));
314 void MailWebEngineView::scrollPageDown(
int percent)
316 runJavaScriptInWordId(WebEngineViewer::WebEngineScript::scrollPercentage(percent));
319 void MailWebEngineView::scrollPageUp(
int percent)
321 scrollPageDown(-percent);
324 void MailWebEngineView::scrollToRelativePosition(qreal pos)
326 runJavaScriptInWordId(WebEngineViewer::WebEngineScript::scrollToRelativePosition(pos));
329 void MailWebEngineView::setAllowExternalContent(
bool b)
331 if (d->mExternalReference->allowExternalContent() != b) {
332 d->mExternalReference->setAllowExternalContent(b);
339 return d->mNetworkAccessManager->interceptorUrlActions(result);
342 void MailWebEngineView::slotLoadFinished()
347 void MailWebEngineView::setPrintElementBackground(
bool printElementBackground)
349 d->mPageEngine->setPrintElementBackground(printElementBackground);
352 bool MailWebEngineView::execPrintPreviewPage(
QPrinter *printer,
int timeout)
354 return d->mPageEngine->execPrintPreviewPage(printer, timeout);
357 void 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);