Much work, using Qt 6.10 on Linux for better https support

This commit is contained in:
2026-03-11 17:57:55 +01:00
parent 989c3d328a
commit 7d234bc834
16 changed files with 541 additions and 217 deletions

View File

@@ -10,13 +10,37 @@
#include <QJsonObject>
#include <QWebEngineScriptCollection>
#include <QWebEngineScript>
#include <QWebEngineProfile>
#include <QWebEngineProfileBuilder>
#include <QWebEnginePage>
#include <QMoveEvent>
#include <QWindow>
#include <QWebEngineProfileBuilder>
WebviewWindow::WebviewWindow(WebviewWindow *parent)
/*
static void displ(QSslCertificate & cert, QSslCertificate::SubjectInfo &a) {
QStringList issuerInfo = cert.issuerInfo(a);
int i, N;
printf("%d\n", a);
for(i = 0, N = issuerInfo.size(); i < N; i++) {
printf("%d[%d]: %s\n", a, i, issuerInfo[i].toUtf8().constData());
}
};
static void displ1(QSslCertificate &cert, QList<QSslCertificate::SubjectInfo > l) {
int i, N;
for(i = 0, N = l.size(); i < N; i++) {
displ(cert, l[i]);
}
};
*/
WebviewWindow::WebviewWindow(WebviewWindow *parent, bool has_scp, QByteArray scp_pem)
: QMainWindow{parent}
{
static int profile_nr = 0;
_view = nullptr;
_must_close = false;
@@ -27,6 +51,22 @@ WebviewWindow::WebviewWindow(WebviewWindow *parent)
_moved = 0;
_resized = 0;
QWebEngineProfileBuilder b;
if (has_scp) {
profile_nr += 1;
char buf[100];
sprintf(buf, "profile-%d", profile_nr);
QString name(buf);
QSslCertificate cert(scp_pem);
QList<QSslCertificate> certs;
certs.append(cert);
b.setAdditionalTrustedCertificates(certs);
_profile = b.createProfile(name);
} else {
_profile = QWebEngineProfile::defaultProfile();
}
if (parent != nullptr) {
setWindowModality(Qt::WindowModality::WindowModal);
setWindowFlag(Qt::WindowType::Dialog, true);
@@ -36,9 +76,63 @@ WebviewWindow::WebviewWindow(WebviewWindow *parent)
connect(&_move_timer, &QTimer::timeout, this, &WebviewWindow::triggerMove);
}
void WebviewWindow::navigationRequested(QWebEngineNavigationRequest &req)
{
if (req.navigationType() == QWebEngineNavigationRequest::NavigationType::TypedNavigation) {
req.accept();
} else {
EventContainer e("navigation-request");
e["url"] = req.url().toString();
QString type;
switch (req.navigationType()) {
case QWebEngineNavigationRequest::NavigationType::LinkClickedNavigation: type = "link-clicked";
break;
case QWebEngineNavigationRequest::NavigationType::TypedNavigation: type = "typed";
break;
case QWebEngineNavigationRequest::NavigationType::FormSubmittedNavigation: type = "form-submit";
break;
case QWebEngineNavigationRequest::NavigationType::BackForwardNavigation: type = "back-or-forward";
break;
case QWebEngineNavigationRequest::NavigationType::ReloadNavigation: type = "reload";
break;
case QWebEngineNavigationRequest::NavigationType::RedirectNavigation: type = "redirect";
break;
default: type = "other";
break;
}
e["type"] = type;
_container->triggerEvent(_view->id(), e);
req.reject();
}
}
void WebviewWindow::handleCertificate(const QWebEngineCertificateError &certificateError)
{
/*
QList<QSslCertificate> certs = _view->page()->profile()->additionalTrustedCertificates();
auto dodisp = [](QList<QSslCertificate> certs)
{
int i;
for(i = 0; i < certs.size(); i++) {
QSslCertificate cert = certs[i];
QList<QSslCertificate::SubjectInfo> attrs;
attrs.append(QSslCertificate::Organization);
attrs.append(QSslCertificate::OrganizationalUnitName);
attrs.append(QSslCertificate::CountryName);
attrs.append(QSslCertificate::CommonName);
displ1(cert, attrs);
}
};
dodisp(certs);
dodisp(certificateError.certificateChain());
*/
fprintf(stderr, "Certificate Error: %s\n", certificateError.description().toUtf8().constData());
QList<QSslCertificate> chain = certificateError.certificateChain();
int i;
for(i = 0; i < chain.size(); i++) {
@@ -88,6 +182,7 @@ void WebviewWindow::closeEvent(QCloseEvent *evt)
EventContainer e("closed");
_container->triggerEvent(_view->id(), e);
_container->removeView(_view->id());
_view->deleteLater();
this->deleteLater();
if (_devtools != nullptr) {
_devtools->deleteLater();
@@ -131,7 +226,14 @@ void WebviewWindow::addView(WebViewQt *v, Rktwebview_qt *c)
_view = v;
this->setCentralWidget(v);
QWebEnginePage *page = _view->page();
QWebEnginePage *page;
if (_profile == nullptr) {
page = _view->page();
} else {
page = new QWebEnginePage(_profile, this);
_view->setPage(page);
}
// Inject event handling code for the javascript side
QWebEngineScriptCollection &col = page->scripts();
@@ -160,6 +262,8 @@ void WebviewWindow::addView(WebViewQt *v, Rktwebview_qt *c)
connect(page, &QWebEnginePage::loadStarted, this, [this]() {
_container->onPageLoad(_view->id());
});
connect(page, &QWebEnginePage::navigationRequested, this, &WebviewWindow::navigationRequested);
connect(page, &QWebEnginePage::certificateError, this, &WebviewWindow::handleCertificate);
}
@@ -231,6 +335,11 @@ void WebviewWindow::triggerMove()
_container->triggerEvent(_view->id(), xy);
}
QWebEngineProfile *WebviewWindow::profile()
{
return _profile;
}
void WebviewWindow::resizeEvent(QResizeEvent *event)
{
_w = event->size().width();