Much work, using Qt 6.10 on Linux for better https support
This commit is contained in:
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user