From 1b6885608c09d8788daafb4e171ce781f885e021 Mon Sep 17 00:00:00 2001 From: Aqua-sama Date: Thu, 23 Aug 2018 14:50:58 +0200 Subject: WebPage: add render process crash recovery page --- src/webengine/webpage.cpp | 36 ++++++++++++++++++++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-) (limited to 'src/webengine/webpage.cpp') diff --git a/src/webengine/webpage.cpp b/src/webengine/webpage.cpp index b075fa1..ff57ac5 100644 --- a/src/webengine/webpage.cpp +++ b/src/webengine/webpage.cpp @@ -9,9 +9,23 @@ #include "webpage.h" #include #include - +#include #include +QString tr_terminationStatus(QWebEnginePage::RenderProcessTerminationStatus status) +{ + switch (status) { + case QWebEnginePage::NormalTerminationStatus: + return QObject::tr("The render process terminated normally."); + case QWebEnginePage::AbnormalTerminationStatus: + return QObject::tr("The render process terminated with with a non-zero exit status."); + case QWebEnginePage::CrashedTerminationStatus: + return QObject::tr("The render process crashed, for example because of a segmentation fault."); + case QWebEnginePage::KilledTerminationStatus: + return QObject::tr("The render process was killed, for example by SIGKILL or task manager kill."); + } +} + QString feature_toString(QWebEnginePage::Feature feature) { switch(feature) { @@ -32,7 +46,6 @@ QString feature_toString(QWebEnginePage::Feature feature) case QWebEnginePage::DesktopAudioVideoCapture: return QObject::tr("Desktop Audio and Video Capture"); } - return QString(); } WebPage::WebPage(QWebEngineProfile *profile, QObject *parent) @@ -43,6 +56,7 @@ WebPage::WebPage(QWebEngineProfile *profile, QObject *parent) }); connect(this, &QWebEnginePage::featurePermissionRequested, this, &WebPage::featurePermissionDialog); + connect(this, &QWebEnginePage::renderProcessTerminated, this, &WebPage::renderProcessCrashed); } bool WebPage::certificateError(const QWebEngineCertificateError &certificateError) @@ -118,3 +132,21 @@ void WebPage::featurePermissionDialog(const QUrl &securityOrigin, QWebEnginePage else setFeaturePermission(securityOrigin, feature, QWebEnginePage::PermissionDeniedByUser); } + +void WebPage::renderProcessCrashed(QWebEnginePage::RenderProcessTerminationStatus terminationStatus, int exitCode) +{ + if(terminationStatus != QWebEnginePage::NormalTerminationStatus) { +#ifdef QT_DEBUG + qDebug("render process terminated: [%i] %i", terminationStatus, exitCode); +#endif + + QString page = "

This tab has crashed!

%message%"; + page.replace(QLatin1String("%message%"), QString("

%1
Exit code is %2.

" + "

Press here to reload this tab.

").arg(tr_terminationStatus(terminationStatus), QString::number(exitCode), + this->url().toEncoded())); + + QTimer::singleShot(0, this, [=]() { + setHtml(page.toUtf8(), url()); + }); + } +} -- cgit v1.2.1