From 19c6b0a22f20a33c8c1fd4bdea29468fa8b4e10e Mon Sep 17 00:00:00 2001 From: Peter Varga Date: Mon, 14 Jun 2021 16:20:26 +0200 Subject: Support HTML5 element The datalist uses Chromium's autofill component to fetch and filter predefined options in the list and autocomplete the field with the selected option. Autofill component is added to build and bound to WebEngine. All the unnecessary autofill features for datalist are supposed to be disabled: payment/credit card support, password manager, save profile data, store suggestions in database etc. Custom popups for the dropdown are implemented for Widget and Quick. Scrolling in dropdown is not implemented in this change. Fixes: QTBUG-54433 Pick-to: 6.4 Change-Id: I155d02d6dbc9d88fbca4bc5f55b76c19d0ba7a9d Reviewed-by: Allan Sandfeld Jensen --- src/webenginewidgets/api/qwebengineview.cpp | 31 +++++++++++++++++++++++++++++ src/webenginewidgets/api/qwebengineview.h | 5 +++++ src/webenginewidgets/api/qwebengineview_p.h | 9 +++++++++ 3 files changed, 45 insertions(+) (limited to 'src/webenginewidgets/api') diff --git a/src/webenginewidgets/api/qwebengineview.cpp b/src/webenginewidgets/api/qwebengineview.cpp index 9fa5f11fc..5fdd995b8 100644 --- a/src/webenginewidgets/api/qwebengineview.cpp +++ b/src/webenginewidgets/api/qwebengineview.cpp @@ -43,12 +43,15 @@ #include "render_widget_host_view_qt_delegate_client.h" #include "render_widget_host_view_qt_delegate_item.h" #include "qwebengine_accessible.h" +#include "ui/autofillpopupwidget_p.h" #include #include #include #include #include + +#include "autofill_popup_controller.h" #include "color_chooser_controller.h" #include "web_contents_adapter.h" @@ -911,6 +914,34 @@ QWebEngineContextMenuRequest *QWebEngineViewPrivate::lastContextMenuRequest() co { return m_contextRequest; } + +void QWebEngineViewPrivate::showAutofillPopup(QtWebEngineCore::AutofillPopupController *controller, + const QRect &bounds, bool autoselectFirstSuggestion) +{ + Q_Q(QWebEngineView); + if (!m_autofillPopupWidget) + m_autofillPopupWidget.reset(new QtWebEngineWidgetUI::AutofillPopupWidget(controller, q)); + m_autofillPopupWidget->showPopup(q->mapToGlobal(bounds.bottomLeft()), bounds.width() + 2, + autoselectFirstSuggestion); + controller->notifyPopupShown(); +} + +void QWebEngineViewPrivate::hideAutofillPopup() +{ + if (!m_autofillPopupWidget) + return; + + Q_Q(QWebEngineView); + QTimer::singleShot(0, q, [this] { + if (m_autofillPopupWidget) { + QtWebEngineCore::AutofillPopupController *controller = + m_autofillPopupWidget->m_controller; + m_autofillPopupWidget.reset(); + controller->notifyPopupHidden(); + } + }); +} + /*! \fn QWebEngineView::renderProcessTerminated(QWebEnginePage::RenderProcessTerminationStatus terminationStatus, int exitCode) \since 5.6 diff --git a/src/webenginewidgets/api/qwebengineview.h b/src/webenginewidgets/api/qwebengineview.h index cc1495d24..b3dd66f85 100644 --- a/src/webenginewidgets/api/qwebengineview.h +++ b/src/webenginewidgets/api/qwebengineview.h @@ -47,6 +47,10 @@ #include #include +namespace QtWebEngineWidgetUI { +class AutofillPopupWidget; +} + QT_BEGIN_NAMESPACE class QContextMenuEvent; @@ -169,6 +173,7 @@ private: Q_DECLARE_PRIVATE(QWebEngineView) QScopedPointer d_ptr; + friend class QtWebEngineWidgetUI::AutofillPopupWidget; friend class QWebEnginePage; friend class QWebEnginePagePrivate; #if QT_CONFIG(accessibility) diff --git a/src/webenginewidgets/api/qwebengineview_p.h b/src/webenginewidgets/api/qwebengineview_p.h index e3c9468ce..44eb32203 100644 --- a/src/webenginewidgets/api/qwebengineview_p.h +++ b/src/webenginewidgets/api/qwebengineview_p.h @@ -56,12 +56,17 @@ #include "render_view_context_menu_qt.h" namespace QtWebEngineCore { +class AutofillPopupController; class QWebEngineContextMenuRequest; class WebEngineQuickWidget; class RenderWidgetHostViewQtDelegate; class RenderWidgetHostViewQtDelegateClient; } +namespace QtWebEngineWidgetUI { +class AutofillPopupWidget; +} + QT_BEGIN_NAMESPACE class QMenu; @@ -99,6 +104,9 @@ public: void didPrintPage(QPrinter *&printer, QSharedPointer result) override; void didPrintPageToPdf(const QString &filePath, bool success) override; void printRequested() override; + void showAutofillPopup(QtWebEngineCore::AutofillPopupController *controller, + const QRect &bounds, bool autoselectFirstSuggestion) override; + void hideAutofillPopup() override; QWebEngineViewPrivate(); virtual ~QWebEngineViewPrivate(); @@ -117,6 +125,7 @@ public: bool m_dragEntered; mutable bool m_ownsPage; QWebEngineContextMenuRequest *m_contextRequest; + QScopedPointer m_autofillPopupWidget; }; class QContextMenuBuilder : public QtWebEngineCore::RenderViewContextMenuQt -- cgit v1.2.3