From e3381218acdbec1e9c207ef3eb35371e22941257 Mon Sep 17 00:00:00 2001 From: Michal Klocek Date: Mon, 19 Oct 2020 09:16:44 +0200 Subject: Remove qwebengineview setter from qwebenginepage Change-Id: Ifaac7287d24e38e04e217cae65f6e5294e8bdd9e Reviewed-by: Allan Sandfeld Jensen --- examples/webenginewidgets/printme/main.cpp | 2 +- examples/webenginewidgets/printme/printhandler.cpp | 18 +-- examples/webenginewidgets/printme/printhandler.h | 6 +- .../webenginewidgets/simplebrowser/webpage.cpp | 116 +--------------- examples/webenginewidgets/simplebrowser/webpage.h | 8 +- .../webenginewidgets/simplebrowser/webview.cpp | 150 +++++++++++++++++++++ examples/webenginewidgets/simplebrowser/webview.h | 11 ++ 7 files changed, 181 insertions(+), 130 deletions(-) (limited to 'examples') diff --git a/examples/webenginewidgets/printme/main.cpp b/examples/webenginewidgets/printme/main.cpp index 212faf12e..3993c6740 100644 --- a/examples/webenginewidgets/printme/main.cpp +++ b/examples/webenginewidgets/printme/main.cpp @@ -64,7 +64,7 @@ int main(int argc, char *argv[]) view.show(); PrintHandler handler; - handler.setPage(view.page()); + handler.setView(&view); auto printPreviewShortCut = new QShortcut(QKeySequence(Qt::CTRL | Qt::Key_P), &view); auto printShortCut = new QShortcut(QKeySequence(Qt::CTRL | Qt::SHIFT | Qt::Key_P), &view); diff --git a/examples/webenginewidgets/printme/printhandler.cpp b/examples/webenginewidgets/printme/printhandler.cpp index d8c4fc177..9d23c5b1f 100644 --- a/examples/webenginewidgets/printme/printhandler.cpp +++ b/examples/webenginewidgets/printme/printhandler.cpp @@ -54,7 +54,7 @@ #include #include #include -#include +#include PrintHandler::PrintHandler(QObject *parent) : QObject(parent) @@ -62,17 +62,17 @@ PrintHandler::PrintHandler(QObject *parent) } -void PrintHandler::setPage(QWebEnginePage *page) +void PrintHandler::setView(QWebEngineView *view) { - Q_ASSERT(!m_page); - m_page = page; - connect(m_page, &QWebEnginePage::printRequested, this, &PrintHandler::printPreview); + Q_ASSERT(!m_view); + m_view = view; + connect(view->page(), &QWebEnginePage::printRequested, this, &PrintHandler::printPreview); } void PrintHandler::print() { QPrinter printer(QPrinter::HighResolution); - QPrintDialog dialog(&printer, m_page->view()); + QPrintDialog dialog(&printer, m_view); if (dialog.exec() != QDialog::Accepted) return; printDocument(&printer); @@ -83,7 +83,7 @@ void PrintHandler::printDocument(QPrinter *printer) QEventLoop loop; bool result; auto printPreview = [&](bool success) { result = success; loop.quit(); }; - m_page->print(printer, std::move(printPreview)); + m_view->page()->print(printer, std::move(printPreview)); loop.exec(); if (!result) { QPainter painter; @@ -101,13 +101,13 @@ void PrintHandler::printDocument(QPrinter *printer) void PrintHandler::printPreview() { - if (!m_page) + if (!m_view) return; if (m_inPrintPreview) return; m_inPrintPreview = true; QPrinter printer; - QPrintPreviewDialog preview(&printer, m_page->view()); + QPrintPreviewDialog preview(&printer, m_view); connect(&preview, &QPrintPreviewDialog::paintRequested, this, &PrintHandler::printDocument); preview.exec(); diff --git a/examples/webenginewidgets/printme/printhandler.h b/examples/webenginewidgets/printme/printhandler.h index 69b71f4a8..663fd73d6 100644 --- a/examples/webenginewidgets/printme/printhandler.h +++ b/examples/webenginewidgets/printme/printhandler.h @@ -56,7 +56,7 @@ QT_BEGIN_NAMESPACE class QPainter; class QPrinter; -class QWebEnginePage; +class QWebEngineView; QT_END_NAMESPACE class PrintHandler : public QObject @@ -64,7 +64,7 @@ class PrintHandler : public QObject Q_OBJECT public: PrintHandler(QObject *parent = nullptr); - void setPage(QWebEnginePage *page); + void setView(QWebEngineView *view); public slots: void print(); @@ -72,7 +72,7 @@ public slots: void printDocument(QPrinter *printer); private: - QWebEnginePage *m_page = nullptr; + QWebEngineView *m_view = nullptr; bool m_inPrintPreview = false; }; diff --git a/examples/webenginewidgets/simplebrowser/webpage.cpp b/examples/webenginewidgets/simplebrowser/webpage.cpp index c4d7204cb..4db147526 100644 --- a/examples/webenginewidgets/simplebrowser/webpage.cpp +++ b/examples/webenginewidgets/simplebrowser/webpage.cpp @@ -50,78 +50,22 @@ #include "browserwindow.h" #include "tabwidget.h" -#include "ui_certificateerrordialog.h" -#include "ui_passworddialog.h" + #include "webpage.h" #include "webview.h" -#include -#include -#include #include -#include WebPage::WebPage(QWebEngineProfile *profile, QObject *parent) : QWebEnginePage(profile, parent) { - connect(this, &QWebEnginePage::authenticationRequired, this, &WebPage::handleAuthenticationRequired); - connect(this, &QWebEnginePage::featurePermissionRequested, this, &WebPage::handleFeaturePermissionRequested); - connect(this, &QWebEnginePage::proxyAuthenticationRequired, this, &WebPage::handleProxyAuthenticationRequired); - connect(this, &QWebEnginePage::registerProtocolHandlerRequested, this, &WebPage::handleRegisterProtocolHandlerRequested); connect(this, &QWebEnginePage::selectClientCertificate, this, &WebPage::handleSelectClientCertificate); } void WebPage::certificateError(QWebEngineCertificateError error) { - QWidget *mainWindow = view()->window(); - error.defer(); - - QTimer::singleShot(0, mainWindow, [mainWindow, error]() mutable { - QDialog dialog(mainWindow); - dialog.setModal(true); - dialog.setWindowFlags(dialog.windowFlags() & ~Qt::WindowContextHelpButtonHint); - - Ui::CertificateErrorDialog certificateDialog; - certificateDialog.setupUi(&dialog); - certificateDialog.m_iconLabel->setText(QString()); - QIcon icon(mainWindow->style()->standardIcon(QStyle::SP_MessageBoxWarning, 0, mainWindow)); - certificateDialog.m_iconLabel->setPixmap(icon.pixmap(32, 32)); - certificateDialog.m_errorLabel->setText(error.description()); - dialog.setWindowTitle(tr("Certificate Error")); - - if (dialog.exec() == QDialog::Accepted) - error.acceptCertificate(); - else - error.rejectCertificate(); - }); -} - -void WebPage::handleAuthenticationRequired(const QUrl &requestUrl, QAuthenticator *auth) -{ - QWidget *mainWindow = view()->window(); - QDialog dialog(mainWindow); - dialog.setModal(true); - dialog.setWindowFlags(dialog.windowFlags() & ~Qt::WindowContextHelpButtonHint); - - Ui::PasswordDialog passwordDialog; - passwordDialog.setupUi(&dialog); - - passwordDialog.m_iconLabel->setText(QString()); - QIcon icon(mainWindow->style()->standardIcon(QStyle::SP_MessageBoxQuestion, 0, mainWindow)); - passwordDialog.m_iconLabel->setPixmap(icon.pixmap(32, 32)); - - QString introMessage(tr("Enter username and password for \"%1\" at %2") - .arg(auth->realm()).arg(requestUrl.toString().toHtmlEscaped())); - passwordDialog.m_infoLabel->setText(introMessage); - passwordDialog.m_infoLabel->setWordWrap(true); - - if (dialog.exec() == QDialog::Accepted) { - auth->setUser(passwordDialog.m_userNameLineEdit->text()); - auth->setPassword(passwordDialog.m_passwordLineEdit->text()); - } else { - // Set authenticator null if dialog is cancelled - *auth = QAuthenticator(); - } + QTimer::singleShot(0, this, + [this, error]() mutable { emit createCertificateErrorDialog(error); }); } inline QString questionForFeature(QWebEnginePage::Feature feature) @@ -147,60 +91,6 @@ inline QString questionForFeature(QWebEnginePage::Feature feature) return QString(); } -void WebPage::handleFeaturePermissionRequested(const QUrl &securityOrigin, Feature feature) -{ - QString title = tr("Permission Request"); - QString question = questionForFeature(feature).arg(securityOrigin.host()); - if (!question.isEmpty() && QMessageBox::question(view()->window(), title, question) == QMessageBox::Yes) - setFeaturePermission(securityOrigin, feature, PermissionGrantedByUser); - else - setFeaturePermission(securityOrigin, feature, PermissionDeniedByUser); -} - -void WebPage::handleProxyAuthenticationRequired(const QUrl &, QAuthenticator *auth, const QString &proxyHost) -{ - QWidget *mainWindow = view()->window(); - QDialog dialog(mainWindow); - dialog.setModal(true); - dialog.setWindowFlags(dialog.windowFlags() & ~Qt::WindowContextHelpButtonHint); - - Ui::PasswordDialog passwordDialog; - passwordDialog.setupUi(&dialog); - - passwordDialog.m_iconLabel->setText(QString()); - QIcon icon(mainWindow->style()->standardIcon(QStyle::SP_MessageBoxQuestion, 0, mainWindow)); - passwordDialog.m_iconLabel->setPixmap(icon.pixmap(32, 32)); - - QString introMessage = tr("Connect to proxy \"%1\" using:"); - introMessage = introMessage.arg(proxyHost.toHtmlEscaped()); - passwordDialog.m_infoLabel->setText(introMessage); - passwordDialog.m_infoLabel->setWordWrap(true); - - if (dialog.exec() == QDialog::Accepted) { - auth->setUser(passwordDialog.m_userNameLineEdit->text()); - auth->setPassword(passwordDialog.m_passwordLineEdit->text()); - } else { - // Set authenticator null if dialog is cancelled - *auth = QAuthenticator(); - } -} - -//! [registerProtocolHandlerRequested] -void WebPage::handleRegisterProtocolHandlerRequested(QWebEngineRegisterProtocolHandlerRequest request) -{ - auto answer = QMessageBox::question( - view()->window(), - tr("Permission Request"), - tr("Allow %1 to open all %2 links?") - .arg(request.origin().host()) - .arg(request.scheme())); - if (answer == QMessageBox::Yes) - request.accept(); - else - request.reject(); -} -//! [registerProtocolHandlerRequested] - void WebPage::handleSelectClientCertificate(QWebEngineClientCertificateSelection selection) { // Just select one. diff --git a/examples/webenginewidgets/simplebrowser/webpage.h b/examples/webenginewidgets/simplebrowser/webpage.h index d69c459e9..00eb48156 100644 --- a/examples/webenginewidgets/simplebrowser/webpage.h +++ b/examples/webenginewidgets/simplebrowser/webpage.h @@ -53,6 +53,7 @@ #include #include +#include class WebPage : public QWebEnginePage { @@ -61,14 +62,13 @@ class WebPage : public QWebEnginePage public: WebPage(QWebEngineProfile *profile, QObject *parent = nullptr); +signals: + void createCertificateErrorDialog(QWebEngineCertificateError error); + protected: void certificateError(QWebEngineCertificateError error) override; private slots: - void handleAuthenticationRequired(const QUrl &requestUrl, QAuthenticator *auth); - void handleFeaturePermissionRequested(const QUrl &securityOrigin, Feature feature); - void handleProxyAuthenticationRequired(const QUrl &requestUrl, QAuthenticator *auth, const QString &proxyHost); - void handleRegisterProtocolHandlerRequested(QWebEngineRegisterProtocolHandlerRequest request); void handleSelectClientCertificate(QWebEngineClientCertificateSelection clientCertSelection); }; diff --git a/examples/webenginewidgets/simplebrowser/webview.cpp b/examples/webenginewidgets/simplebrowser/webview.cpp index 28ae8eecd..5bd0a5ef4 100644 --- a/examples/webenginewidgets/simplebrowser/webview.cpp +++ b/examples/webenginewidgets/simplebrowser/webview.cpp @@ -54,11 +54,15 @@ #include "webpage.h" #include "webpopupwindow.h" #include "webview.h" +#include "ui_certificateerrordialog.h" +#include "ui_passworddialog.h" #include #include #include #include +#include #include +#include WebView::WebView(QWidget *parent) : QWebEngineView(parent) @@ -104,13 +108,56 @@ WebView::WebView(QWidget *parent) }); } +inline QString questionForFeature(QWebEnginePage::Feature feature) +{ + switch (feature) { + case QWebEnginePage::Geolocation: + return QObject::tr("Allow %1 to access your location information?"); + case QWebEnginePage::MediaAudioCapture: + return QObject::tr("Allow %1 to access your microphone?"); + case QWebEnginePage::MediaVideoCapture: + return QObject::tr("Allow %1 to access your webcam?"); + case QWebEnginePage::MediaAudioVideoCapture: + return QObject::tr("Allow %1 to access your microphone and webcam?"); + case QWebEnginePage::MouseLock: + return QObject::tr("Allow %1 to lock your mouse cursor?"); + case QWebEnginePage::DesktopVideoCapture: + return QObject::tr("Allow %1 to capture video of your desktop?"); + case QWebEnginePage::DesktopAudioVideoCapture: + return QObject::tr("Allow %1 to capture audio and video of your desktop?"); + case QWebEnginePage::Notifications: + return QObject::tr("Allow %1 to show notification on your desktop?"); + } + return QString(); +} + void WebView::setPage(WebPage *page) { + WebPage *oldPage = qobject_cast(QWebEngineView::page()); + disconnect(oldPage, &WebPage::createCertificateErrorDialog, this, + &WebView::handleCertificateError); + disconnect(oldPage, &QWebEnginePage::authenticationRequired, this, + &WebView::handleAuthenticationRequired); + disconnect(oldPage, &QWebEnginePage::featurePermissionRequested, this, + &WebView::handleFeaturePermissionRequested); + disconnect(oldPage, &QWebEnginePage::proxyAuthenticationRequired, this, + &WebView::handleProxyAuthenticationRequired); + disconnect(oldPage, &QWebEnginePage::registerProtocolHandlerRequested, this, + &WebView::handleRegisterProtocolHandlerRequested); createWebActionTrigger(page,QWebEnginePage::Forward); createWebActionTrigger(page,QWebEnginePage::Back); createWebActionTrigger(page,QWebEnginePage::Reload); createWebActionTrigger(page,QWebEnginePage::Stop); QWebEngineView::setPage(page); + connect(page, &WebPage::createCertificateErrorDialog, this, &WebView::handleCertificateError); + connect(page, &QWebEnginePage::authenticationRequired, this, + &WebView::handleAuthenticationRequired); + connect(page, &QWebEnginePage::featurePermissionRequested, this, + &WebView::handleFeaturePermissionRequested); + connect(page, &QWebEnginePage::proxyAuthenticationRequired, this, + &WebView::handleProxyAuthenticationRequired); + connect(page, &QWebEnginePage::registerProtocolHandlerRequested, this, + &WebView::handleRegisterProtocolHandlerRequested); } int WebView::loadProgress() const @@ -196,3 +243,106 @@ void WebView::contextMenuEvent(QContextMenuEvent *event) menu->popup(event->globalPos()); } +void WebView::handleCertificateError(QWebEngineCertificateError error) +{ + QDialog dialog(window()); + dialog.setModal(true); + dialog.setWindowFlags(dialog.windowFlags() & ~Qt::WindowContextHelpButtonHint); + + Ui::CertificateErrorDialog certificateDialog; + certificateDialog.setupUi(&dialog); + certificateDialog.m_iconLabel->setText(QString()); + QIcon icon(window()->style()->standardIcon(QStyle::SP_MessageBoxWarning, 0, window())); + certificateDialog.m_iconLabel->setPixmap(icon.pixmap(32, 32)); + certificateDialog.m_errorLabel->setText(error.description()); + dialog.setWindowTitle(tr("Certificate Error")); + + if (dialog.exec() == QDialog::Accepted) + error.acceptCertificate(); + else + error.rejectCertificate(); +} + +void WebView::handleAuthenticationRequired(const QUrl &requestUrl, QAuthenticator *auth) +{ + QDialog dialog(window()); + dialog.setModal(true); + dialog.setWindowFlags(dialog.windowFlags() & ~Qt::WindowContextHelpButtonHint); + + Ui::PasswordDialog passwordDialog; + passwordDialog.setupUi(&dialog); + + passwordDialog.m_iconLabel->setText(QString()); + QIcon icon(window()->style()->standardIcon(QStyle::SP_MessageBoxQuestion, 0, window())); + passwordDialog.m_iconLabel->setPixmap(icon.pixmap(32, 32)); + + QString introMessage(tr("Enter username and password for \"%1\" at %2") + .arg(auth->realm()) + .arg(requestUrl.toString().toHtmlEscaped())); + passwordDialog.m_infoLabel->setText(introMessage); + passwordDialog.m_infoLabel->setWordWrap(true); + + if (dialog.exec() == QDialog::Accepted) { + auth->setUser(passwordDialog.m_userNameLineEdit->text()); + auth->setPassword(passwordDialog.m_passwordLineEdit->text()); + } else { + // Set authenticator null if dialog is cancelled + *auth = QAuthenticator(); + } +} + +void WebView::handleFeaturePermissionRequested(const QUrl &securityOrigin, + QWebEnginePage::Feature feature) +{ + QString title = tr("Permission Request"); + QString question = questionForFeature(feature).arg(securityOrigin.host()); + if (!question.isEmpty() && QMessageBox::question(window(), title, question) == QMessageBox::Yes) + page()->setFeaturePermission(securityOrigin, feature, + QWebEnginePage::PermissionGrantedByUser); + else + page()->setFeaturePermission(securityOrigin, feature, + QWebEnginePage::PermissionDeniedByUser); +} + +void WebView::handleProxyAuthenticationRequired(const QUrl &, QAuthenticator *auth, + const QString &proxyHost) +{ + QDialog dialog(window()); + dialog.setModal(true); + dialog.setWindowFlags(dialog.windowFlags() & ~Qt::WindowContextHelpButtonHint); + + Ui::PasswordDialog passwordDialog; + passwordDialog.setupUi(&dialog); + + passwordDialog.m_iconLabel->setText(QString()); + QIcon icon(window()->style()->standardIcon(QStyle::SP_MessageBoxQuestion, 0, window())); + passwordDialog.m_iconLabel->setPixmap(icon.pixmap(32, 32)); + + QString introMessage = tr("Connect to proxy \"%1\" using:"); + introMessage = introMessage.arg(proxyHost.toHtmlEscaped()); + passwordDialog.m_infoLabel->setText(introMessage); + passwordDialog.m_infoLabel->setWordWrap(true); + + if (dialog.exec() == QDialog::Accepted) { + auth->setUser(passwordDialog.m_userNameLineEdit->text()); + auth->setPassword(passwordDialog.m_passwordLineEdit->text()); + } else { + // Set authenticator null if dialog is cancelled + *auth = QAuthenticator(); + } +} + +//! [registerProtocolHandlerRequested] +void WebView::handleRegisterProtocolHandlerRequested( + QWebEngineRegisterProtocolHandlerRequest request) +{ + auto answer = QMessageBox::question(window(), tr("Permission Request"), + tr("Allow %1 to open all %2 links?") + .arg(request.origin().host()) + .arg(request.scheme())); + if (answer == QMessageBox::Yes) + request.accept(); + else + request.reject(); +} +//! [registerProtocolHandlerRequested] diff --git a/examples/webenginewidgets/simplebrowser/webview.h b/examples/webenginewidgets/simplebrowser/webview.h index 8559a68b8..0dc7c33ad 100644 --- a/examples/webenginewidgets/simplebrowser/webview.h +++ b/examples/webenginewidgets/simplebrowser/webview.h @@ -53,6 +53,9 @@ #include #include +#include +#include +#include class WebPage; @@ -76,6 +79,14 @@ signals: void webActionEnabledChanged(QWebEnginePage::WebAction webAction, bool enabled); void favIconChanged(const QIcon &icon); void devToolsRequested(QWebEnginePage *source); +private slots: + void handleCertificateError(QWebEngineCertificateError error); + void handleAuthenticationRequired(const QUrl &requestUrl, QAuthenticator *auth); + void handleFeaturePermissionRequested(const QUrl &securityOrigin, + QWebEnginePage::Feature feature); + void handleProxyAuthenticationRequired(const QUrl &requestUrl, QAuthenticator *auth, + const QString &proxyHost); + void handleRegisterProtocolHandlerRequested(QWebEngineRegisterProtocolHandlerRequest request); private: void createWebActionTrigger(QWebEnginePage *page, QWebEnginePage::WebAction); -- cgit v1.2.3