From a54d219c3e3cb7c73be03413741bf8d2ef70c9fa Mon Sep 17 00:00:00 2001 From: Michal Klocek Date: Mon, 19 Oct 2020 09:58:06 +0200 Subject: Move dialogs from view to page Change-Id: Ib0f0ccca0d94c6c8f19d7d359bbf79110ba04f3e Reviewed-by: Allan Sandfeld Jensen --- src/webenginewidgets/api/qwebenginepage.cpp | 135 ++++--------------------- src/webenginewidgets/api/qwebengineview.cpp | 148 +++++++++++++++++++++++++++- src/webenginewidgets/api/qwebengineview_p.h | 11 ++- 3 files changed, 175 insertions(+), 119 deletions(-) (limited to 'src') diff --git a/src/webenginewidgets/api/qwebenginepage.cpp b/src/webenginewidgets/api/qwebenginepage.cpp index 5b63f913c..546a1593f 100644 --- a/src/webenginewidgets/api/qwebenginepage.cpp +++ b/src/webenginewidgets/api/qwebenginepage.cpp @@ -76,32 +76,15 @@ #include #include #include -#if QT_CONFIG(colordialog) -#include -#endif -#include -#if QT_CONFIG(filedialog) -#include -#endif #include #include -#if QT_CONFIG(inputdialog) -#include -#endif #include #include -#if QT_CONFIG(menu) -#include -#endif -#if QT_CONFIG(messagebox) -#include -#endif #include #if QT_CONFIG(webengine_printing_and_pdf) #include #include #endif -#include #include #include #include @@ -470,20 +453,8 @@ void QWebEnginePagePrivate::releaseProfile() void QWebEnginePagePrivate::showColorDialog(QSharedPointer controller) { -#if QT_CONFIG(colordialog) - QColorDialog *dialog = new QColorDialog(controller.data()->initialColor(), view); - - QColorDialog::connect(dialog, SIGNAL(colorSelected(QColor)), controller.data(), SLOT(accept(QColor))); - QColorDialog::connect(dialog, SIGNAL(rejected()), controller.data(), SLOT(reject())); - - // Delete when done - QColorDialog::connect(dialog, SIGNAL(colorSelected(QColor)), dialog, SLOT(deleteLater())); - QColorDialog::connect(dialog, SIGNAL(rejected()), dialog, SLOT(deleteLater())); - - dialog->open(); -#else - Q_UNUSED(controller); -#endif + if (view) + view->d_func()->showColorDialog(controller); } void QWebEnginePagePrivate::runMediaAccessPermissionRequest(const QUrl &securityOrigin, WebContentsAdapterClient::MediaRequestFlags requestFlags) @@ -1712,9 +1683,9 @@ void QWebEnginePagePrivate::javascriptDialog(QSharedPointerjavaScriptConfirm(controller->securityOrigin(), QCoreApplication::translate("QWebEnginePage", "Are you sure you want to leave this page? Changes that you made may not be saved.")); break; case InternalAuthorizationDialog: -#if QT_CONFIG(messagebox) - accepted = (QMessageBox::question(view, controller->title(), controller->message(), QMessageBox::Yes, QMessageBox::No) == QMessageBox::Yes); -#endif // QT_CONFIG(messagebox) + accepted = view ? view->d_func()->showAuthorizationDialog(controller->title(), + controller->message()) + : false; break; } if (accepted) @@ -1794,23 +1765,8 @@ bool QWebEnginePagePrivate::isEnabled() const void QWebEnginePagePrivate::setToolTip(const QString &toolTipText) { - if (!view) - return; - - // Hide tooltip if shown. - if (toolTipText.isEmpty()) { - if (!view->toolTip().isEmpty()) - view->setToolTip(QString()); - - return; - } - - // Update tooltip if text was changed. - QString wrappedTip = QLatin1String("

") - % toolTipText.toHtmlEscaped().left(MaxTooltipLength) - % QLatin1String("

"); - if (view->toolTip() != wrappedTip) - view->setToolTip(wrappedTip); + if (view) + view->setToolTip(toolTipText); } void QWebEnginePagePrivate::printRequested() @@ -2263,89 +2219,34 @@ void QWebEnginePage::setDevToolsPage(QWebEnginePage *devToolsPage) ASSERT_ENUMS_MATCH(FilePickerController::Open, QWebEnginePage::FileSelectOpen) ASSERT_ENUMS_MATCH(FilePickerController::OpenMultiple, QWebEnginePage::FileSelectOpenMultiple) +// TODO: remove virtuals QStringList QWebEnginePage::chooseFiles(FileSelectionMode mode, const QStringList &oldFiles, const QStringList &acceptedMimeTypes) { -#if QT_CONFIG(filedialog) - const QStringList &filter = FilePickerController::nameFilters(acceptedMimeTypes); - QStringList ret; - QString str; - switch (static_cast(mode)) { - case FilePickerController::OpenMultiple: - ret = QFileDialog::getOpenFileNames(view(), QString(), QString(), filter.join(QStringLiteral(";;")), nullptr, QFileDialog::HideNameFilterDetails); - break; - // Chromium extension, not exposed as part of the public API for now. - case FilePickerController::UploadFolder: - str = QFileDialog::getExistingDirectory(view(), tr("Select folder to upload")); - if (!str.isNull()) - ret << str; - break; - case FilePickerController::Save: - str = QFileDialog::getSaveFileName(view(), QString(), (QStandardPaths::writableLocation(QStandardPaths::DownloadLocation) + oldFiles.first())); - if (!str.isNull()) - ret << str; - break; - case FilePickerController::Open: - str = QFileDialog::getOpenFileName(view(), QString(), oldFiles.first(), filter.join(QStringLiteral(";;")), nullptr, QFileDialog::HideNameFilterDetails); - if (!str.isNull()) - ret << str; - break; - } - return ret; -#else - Q_UNUSED(mode); - Q_UNUSED(oldFiles); - Q_UNUSED(acceptedMimeTypes); - - return QStringList(); -#endif // QT_CONFIG(filedialog) + Q_D(const QWebEnginePage); + return d->view ? d->view->d_func()->chooseFiles(mode, oldFiles, acceptedMimeTypes) + : QStringList(); } void QWebEnginePage::javaScriptAlert(const QUrl &securityOrigin, const QString &msg) { Q_UNUSED(securityOrigin); -#if QT_CONFIG(messagebox) - QMessageBox::information(view(), - QStringLiteral("Javascript Alert - %1").arg(url().toString()), - msg.toHtmlEscaped()); -#else - Q_UNUSED(msg); -#endif // QT_CONFIG(messagebox) + Q_D(const QWebEnginePage); + if (d->view) + d->view->d_func()->javaScriptAlert(url(), msg); } bool QWebEnginePage::javaScriptConfirm(const QUrl &securityOrigin, const QString &msg) { Q_UNUSED(securityOrigin); -#if QT_CONFIG(messagebox) - return (QMessageBox::information(view(), - QStringLiteral("Javascript Confirm - %1").arg(url().toString()), - msg.toHtmlEscaped(), - QMessageBox::Ok, - QMessageBox::Cancel) == QMessageBox::Ok); -#else - Q_UNUSED(msg); - return false; -#endif // QT_CONFIG(messagebox) + Q_D(const QWebEnginePage); + return d->view ? d->view->d_func()->javaScriptConfirm(url(), msg) : false; } bool QWebEnginePage::javaScriptPrompt(const QUrl &securityOrigin, const QString &msg, const QString &defaultValue, QString *result) { Q_UNUSED(securityOrigin); -#if QT_CONFIG(inputdialog) - bool ret = false; - if (result) - *result = QInputDialog::getText(view(), - QStringLiteral("Javascript Prompt - %1").arg(url().toString()), - msg.toHtmlEscaped(), - QLineEdit::Normal, - defaultValue.toHtmlEscaped(), - &ret); - return ret; -#else - Q_UNUSED(msg); - Q_UNUSED(defaultValue); - Q_UNUSED(result); - return false; -#endif // QT_CONFIG(inputdialog) + Q_D(const QWebEnginePage); + return d->view ? d->view->d_func()->javaScriptPrompt(url(), msg, defaultValue, result) : false; } void QWebEnginePage::javaScriptConsoleMessage(JavaScriptConsoleMessageLevel level, const QString &message, int lineNumber, const QString &sourceID) diff --git a/src/webenginewidgets/api/qwebengineview.cpp b/src/webenginewidgets/api/qwebengineview.cpp index 203682c79..b646cee49 100644 --- a/src/webenginewidgets/api/qwebengineview.cpp +++ b/src/webenginewidgets/api/qwebengineview.cpp @@ -43,7 +43,9 @@ #include "qwebenginepage_p.h" #include "render_widget_host_view_qt_delegate_widget.h" #include "web_contents_adapter.h" - +#include "file_picker_controller.h" +#include "color_chooser_controller.h" +#include #if QT_CONFIG(action) #include #endif @@ -53,6 +55,26 @@ #include #include #include +#if QT_CONFIG(colordialog) +# include +#endif +#include +#if QT_CONFIG(filedialog) +# include +#endif +#include +#include +#if QT_CONFIG(inputdialog) +# include +#endif +#include +#include +#if QT_CONFIG(menu) +# include +#endif +#if QT_CONFIG(messagebox) +# include +#endif QT_BEGIN_NAMESPACE @@ -157,6 +179,130 @@ void QWebEngineViewPrivate::contextMenuRequested(QWebEngineContextMenuRequest *r #endif // QT_CONFIG(action) } +QStringList QWebEngineViewPrivate::chooseFiles(QWebEnginePage::FileSelectionMode mode, + const QStringList &oldFiles, + const QStringList &acceptedMimeTypes) +{ +#if QT_CONFIG(filedialog) + Q_Q(QWebEngineView); + const QStringList &filter = + QtWebEngineCore::FilePickerController::nameFilters(acceptedMimeTypes); + QStringList ret; + QString str; + switch (static_cast(mode)) { + case QtWebEngineCore::FilePickerController::OpenMultiple: + ret = QFileDialog::getOpenFileNames(q, QString(), QString(), + filter.join(QStringLiteral(";;")), nullptr, + QFileDialog::HideNameFilterDetails); + break; + // Chromium extension, not exposed as part of the public API for now. + case QtWebEngineCore::FilePickerController::UploadFolder: + str = QFileDialog::getExistingDirectory(q, QObject::tr("Select folder to upload")); + if (!str.isNull()) + ret << str; + break; + case QtWebEngineCore::FilePickerController::Save: + str = QFileDialog::getSaveFileName( + q, QString(), + (QStandardPaths::writableLocation(QStandardPaths::DownloadLocation) + + oldFiles.first())); + if (!str.isNull()) + ret << str; + break; + case QtWebEngineCore::FilePickerController::Open: + str = QFileDialog::getOpenFileName(q, QString(), oldFiles.first(), + filter.join(QStringLiteral(";;")), nullptr, + QFileDialog::HideNameFilterDetails); + if (!str.isNull()) + ret << str; + break; + } + return ret; +#else + Q_UNUSED(mode); + Q_UNUSED(oldFiles); + Q_UNUSED(acceptedMimeTypes); + + return QStringList(); +#endif // QT_CONFIG(filedialog) +} + +void QWebEngineViewPrivate::showColorDialog( + QSharedPointer controller) +{ +#if QT_CONFIG(colordialog) + Q_Q(QWebEngineView); + QColorDialog *dialog = new QColorDialog(controller.data()->initialColor(), q); + + QColorDialog::connect(dialog, SIGNAL(colorSelected(QColor)), controller.data(), + SLOT(accept(QColor))); + QColorDialog::connect(dialog, SIGNAL(rejected()), controller.data(), SLOT(reject())); + + // Delete when done + QColorDialog::connect(dialog, SIGNAL(colorSelected(QColor)), dialog, SLOT(deleteLater())); + QColorDialog::connect(dialog, SIGNAL(rejected()), dialog, SLOT(deleteLater())); + + dialog->open(); +#else + Q_UNUSED(controller); +#endif +} + +bool QWebEngineViewPrivate::showAuthorizationDialog(const QString &title, const QString &message) +{ +#if QT_CONFIG(messagebox) + Q_Q(QWebEngineView); + return QMessageBox::question(q, title, message, QMessageBox::Yes, QMessageBox::No) + == QMessageBox::Yes; +#else + return false; +#endif // QT_CONFIG(messagebox) +} + +void QWebEngineViewPrivate::javaScriptAlert(const QUrl &url, const QString &msg) +{ +#if QT_CONFIG(messagebox) + Q_Q(QWebEngineView); + QMessageBox::information(q, QStringLiteral("Javascript Alert - %1").arg(url.toString()), + msg.toHtmlEscaped()); +#else + Q_UNUSED(msg); +#endif // QT_CONFIG(messagebox) +} + +bool QWebEngineViewPrivate::javaScriptConfirm(const QUrl &url, const QString &msg) +{ +#if QT_CONFIG(messagebox) + Q_Q(QWebEngineView); + return (QMessageBox::information(q, + QStringLiteral("Javascript Confirm - %1").arg(url.toString()), + msg.toHtmlEscaped(), QMessageBox::Ok, QMessageBox::Cancel) + == QMessageBox::Ok); +#else + Q_UNUSED(msg); + return false; +#endif // QT_CONFIG(messagebox) +} + +bool QWebEngineViewPrivate::javaScriptPrompt(const QUrl &url, const QString &msg, + const QString &defaultValue, QString *result) +{ +#if QT_CONFIG(inputdialog) + Q_Q(QWebEngineView); + bool ret = false; + if (result) + *result = QInputDialog::getText( + q, QStringLiteral("Javascript Prompt - %1").arg(url.toString()), + msg.toHtmlEscaped(), QLineEdit::Normal, defaultValue.toHtmlEscaped(), &ret); + return ret; +#else + Q_UNUSED(msg); + Q_UNUSED(defaultValue); + Q_UNUSED(result); + return false; +#endif // QT_CONFIG(inputdialog) +} + #ifndef QT_NO_ACCESSIBILITY static QAccessibleInterface *webAccessibleFactory(const QString &, QObject *object) { diff --git a/src/webenginewidgets/api/qwebengineview_p.h b/src/webenginewidgets/api/qwebengineview_p.h index 29e39d081..2efb97e13 100644 --- a/src/webenginewidgets/api/qwebengineview_p.h +++ b/src/webenginewidgets/api/qwebengineview_p.h @@ -73,8 +73,17 @@ public: void pageChanged(QWebEnginePage *oldPage, QWebEnginePage *newPage); void widgetChanged(QtWebEngineCore::RenderWidgetHostViewQtDelegateWidget *oldWidget, QtWebEngineCore::RenderWidgetHostViewQtDelegateWidget *newWidget); - void contextMenuRequested(QWebEngineContextMenuRequest *request); + void contextMenuRequested(QWebEngineContextMenuRequest *request); + QStringList chooseFiles(QWebEnginePage::FileSelectionMode mode, const QStringList &oldFiles, + const QStringList &acceptedMimeTypes); + void showColorDialog(QSharedPointer controller); + bool showAuthorizationDialog(const QString &title, const QString &message); + void javaScriptAlert(const QUrl &url, const QString &msg); + bool javaScriptConfirm(const QUrl &url, const QString &msg); + bool javaScriptPrompt(const QUrl &url, const QString &msg, const QString &defaultValue, + QString *result); + void setToolTip(const QString &toolTipText); QWebEngineViewPrivate(); QWebEnginePage *page; -- cgit v1.2.3