From 4c1cde9a1909162fbddeabd958a5f5acc43c83d6 Mon Sep 17 00:00:00 2001 From: Szabolcs David Date: Thu, 8 Jun 2017 15:48:55 +0200 Subject: Implement geometryChangeRequested signal in the Quick API Chromium includes the size of the frame in the requested geometry, but QWindow::setGeometry() and the related properties of QML Window expect a size without frame. This patch - fixes the geometry handling in Demobrowser example. - implements a new signal in the QML API which sends both frameless and extended geometries to the application, because QML doesn't have capability to determine the size of the frame and handle extended geometry correctly. Task-number: QTBUG-51181 Change-Id: I8595593aecca33d7cd46986c7abbad0cc7c18ec2 Reviewed-by: Allan Sandfeld Jensen --- .../webengine/quicknanobrowser/BrowserDialog.qml | 12 ++++++++++-- .../simplebrowser/webpopupwindow.cpp | 7 +++---- src/core/render_widget_host_view_qt.cpp | 1 + src/core/render_widget_host_view_qt.h | 1 + src/core/web_contents_adapter_client.h | 2 +- src/core/web_contents_delegate_qt.cpp | 10 ++++++++-- src/webengine/api/qquickwebengineview.cpp | 6 ++++++ src/webengine/api/qquickwebengineview_p.h | 1 + src/webengine/api/qquickwebengineview_p_p.h | 2 +- src/webengine/doc/src/webengineview.qdoc | 22 ++++++++++++++++++++++ src/webenginewidgets/api/qwebenginepage.cpp | 5 +++-- src/webenginewidgets/api/qwebenginepage_p.h | 2 +- .../doc/src/qwebenginepage_lgpl.qdoc | 8 ++++++++ 13 files changed, 66 insertions(+), 13 deletions(-) diff --git a/examples/webengine/quicknanobrowser/BrowserDialog.qml b/examples/webengine/quicknanobrowser/BrowserDialog.qml index d060e2828..770cfee6a 100644 --- a/examples/webengine/quicknanobrowser/BrowserDialog.qml +++ b/examples/webengine/quicknanobrowser/BrowserDialog.qml @@ -50,11 +50,12 @@ import QtQuick 2.1 import QtQuick.Window 2.2 -import QtWebEngine 1.2 +import QtWebEngine 1.7 Window { + id: window property alias currentWebView: webView - flags: Qt.Dialog + flags: Qt.Dialog | Qt.WindowStaysOnTopHint width: 800 height: 600 visible: true @@ -62,5 +63,12 @@ Window { WebEngineView { id: webView anchors.fill: parent + + onGeometryChangeRequested: { + window.x = geometry.x + window.y = geometry.y + window.width = geometry.width + window.height = geometry.height + } } } diff --git a/examples/webenginewidgets/simplebrowser/webpopupwindow.cpp b/examples/webenginewidgets/simplebrowser/webpopupwindow.cpp index 63246ac1d..5bbab09d4 100644 --- a/examples/webenginewidgets/simplebrowser/webpopupwindow.cpp +++ b/examples/webenginewidgets/simplebrowser/webpopupwindow.cpp @@ -45,6 +45,7 @@ #include #include #include +#include WebPopupWindow::WebPopupWindow(QWebEngineProfile *profile) : m_urlLineEdit(new QLineEdit(this)) @@ -82,10 +83,8 @@ WebView *WebPopupWindow::view() const void WebPopupWindow::handleGeometryChangeRequested(const QRect &newGeometry) { - m_view->setMinimumSize(newGeometry.width(), newGeometry.height()); - move(newGeometry.topLeft() - m_view->pos()); - // let the layout do the magic - resize(0, 0); + if (QWindow *window = windowHandle()) + setGeometry(newGeometry.marginsRemoved(window->frameMargins())); show(); m_view->setFocus(); } diff --git a/src/core/render_widget_host_view_qt.cpp b/src/core/render_widget_host_view_qt.cpp index f36de68c7..fecc1b538 100644 --- a/src/core/render_widget_host_view_qt.cpp +++ b/src/core/render_widget_host_view_qt.cpp @@ -894,6 +894,7 @@ QSGNode *RenderWidgetHostViewQt::updatePaintNode(QSGNode *oldNode) void RenderWidgetHostViewQt::notifyResize() { m_host->WasResized(); + m_host->SendScreenRects(); } void RenderWidgetHostViewQt::notifyShown() diff --git a/src/core/render_widget_host_view_qt.h b/src/core/render_widget_host_view_qt.h index 63efad87e..421375d57 100644 --- a/src/core/render_widget_host_view_qt.h +++ b/src/core/render_widget_host_view_qt.h @@ -118,6 +118,7 @@ public: RenderWidgetHostViewQt(content::RenderWidgetHost* widget); ~RenderWidgetHostViewQt(); + RenderWidgetHostViewQtDelegate *delegate() { return m_delegate.get(); } void setDelegate(RenderWidgetHostViewQtDelegate *delegate); void setAdapterClient(WebContentsAdapterClient *adapterClient); diff --git a/src/core/web_contents_adapter_client.h b/src/core/web_contents_adapter_client.h index 47bef1b21..efcc6cb3e 100644 --- a/src/core/web_contents_adapter_client.h +++ b/src/core/web_contents_adapter_client.h @@ -417,7 +417,7 @@ public: virtual void moveValidationMessage(const QRect &anchor) = 0; RenderProcessTerminationStatus renderProcessExitStatus(int); virtual void renderProcessTerminated(RenderProcessTerminationStatus terminationStatus, int exitCode) = 0; - virtual void requestGeometryChange(const QRect &geometry) = 0; + virtual void requestGeometryChange(const QRect &geometry, const QRect &frameGeometry) = 0; virtual void allowCertificateError(const QSharedPointer &errorController) = 0; virtual void updateScrollPosition(const QPointF &position) = 0; virtual void updateContentsSize(const QSizeF &size) = 0; diff --git a/src/core/web_contents_delegate_qt.cpp b/src/core/web_contents_delegate_qt.cpp index 31180a1c1..aafd50adc 100644 --- a/src/core/web_contents_delegate_qt.cpp +++ b/src/core/web_contents_delegate_qt.cpp @@ -76,6 +76,7 @@ #include #include +#include namespace QtWebEngineCore { @@ -420,8 +421,13 @@ void WebContentsDelegateQt::RequestMediaAccessPermission(content::WebContents *w void WebContentsDelegateQt::MoveContents(content::WebContents *source, const gfx::Rect &pos) { - Q_UNUSED(source) - m_viewClient->requestGeometryChange(toQt(pos)); + QRect frameGeometry(toQt(pos)); + QRect geometry; + if (RenderWidgetHostViewQt *rwhv = static_cast(web_contents()->GetRenderWidgetHostView())) { + if (rwhv->delegate() && rwhv->delegate()->window()) + geometry = frameGeometry.marginsRemoved(rwhv->delegate()->window()->frameMargins()); + } + m_viewClient->requestGeometryChange(geometry, frameGeometry); } bool WebContentsDelegateQt::IsPopupOrPanel(const content::WebContents *source) const diff --git a/src/webengine/api/qquickwebengineview.cpp b/src/webengine/api/qquickwebengineview.cpp index c100c1f20..5e5d91012 100644 --- a/src/webengine/api/qquickwebengineview.cpp +++ b/src/webengine/api/qquickwebengineview.cpp @@ -1185,6 +1185,12 @@ void QQuickWebEngineViewPrivate::renderProcessTerminated( renderProcessExitStatus(terminationStatus)), exitCode); } +void QQuickWebEngineViewPrivate::requestGeometryChange(const QRect &geometry, const QRect &frameGeometry) +{ + Q_Q(QQuickWebEngineView); + Q_EMIT q->geometryChangeRequested(geometry, frameGeometry); +} + void QQuickWebEngineViewPrivate::startDragging(const content::DropData &dropData, Qt::DropActions allowedActions, const QPixmap &pixmap, const QPoint &offset) diff --git a/src/webengine/api/qquickwebengineview_p.h b/src/webengine/api/qquickwebengineview_p.h index 59636188f..ee7e01f26 100644 --- a/src/webengine/api/qquickwebengineview_p.h +++ b/src/webengine/api/qquickwebengineview_p.h @@ -556,6 +556,7 @@ Q_SIGNALS: Q_REVISION(4) void formValidationMessageRequested(QQuickWebEngineFormValidationMessageRequest *request); Q_REVISION(5) void pdfPrintingFinished(const QString &filePath, bool success); Q_REVISION(7) void quotaPermissionRequested(const QQuickWebEngineQuotaPermissionRequest &request); + Q_REVISION(7) void geometryChangeRequested(const QRect &geometry, const QRect &frameGeometry); #ifdef ENABLE_QML_TESTSUPPORT_API void testSupportChanged(); diff --git a/src/webengine/api/qquickwebengineview_p_p.h b/src/webengine/api/qquickwebengineview_p_p.h index 6ba9f62b8..b50a524ef 100644 --- a/src/webengine/api/qquickwebengineview_p_p.h +++ b/src/webengine/api/qquickwebengineview_p_p.h @@ -139,7 +139,7 @@ public: void moveValidationMessage(const QRect &anchor) override; virtual void renderProcessTerminated(RenderProcessTerminationStatus terminationStatus, int exitCode) override; - void requestGeometryChange(const QRect &geometry) override { Q_UNUSED(geometry); } + void requestGeometryChange(const QRect &geometry, const QRect &frameGeometry) override; void updateScrollPosition(const QPointF &position) override; void updateContentsSize(const QSizeF &size) override; void startDragging(const content::DropData &dropData, Qt::DropActions allowedActions, diff --git a/src/webengine/doc/src/webengineview.qdoc b/src/webengine/doc/src/webengineview.qdoc index 4f0c40e0d..20db51793 100644 --- a/src/webengine/doc/src/webengineview.qdoc +++ b/src/webengine/doc/src/webengineview.qdoc @@ -1355,3 +1355,25 @@ \qmlmethod void QuotaPermissionRequest::reject() Rejects a quota permission request. */ + +/*! + \qmlsignal WebEngineView::geometryChangeRequested(rect geometry, rect frameGeometry) + \since QtWebEngine 1.7 + + This signal is emitted whenever the document wants to change the position and size of the + page to \a frameGeometry. This can happen for example through JavaScript. + + While \a frameGeometry includes, \a geometry excludes the size of frame margins. + + \note Geometry related properties of QML Window expect a size excluding the window + decoration. You have to use \a geometry to handle this signal correctly. + + \qml + onGeometryChangeRequested: { + window.x = geometry.x + window.y = geometry.y + window.width = geometry.width + window.height = geometry.height + } + \endqml +*/ diff --git a/src/webenginewidgets/api/qwebenginepage.cpp b/src/webenginewidgets/api/qwebenginepage.cpp index a6ff4583f..dc525db93 100644 --- a/src/webenginewidgets/api/qwebenginepage.cpp +++ b/src/webenginewidgets/api/qwebenginepage.cpp @@ -1616,10 +1616,11 @@ void QWebEnginePagePrivate::renderProcessTerminated(RenderProcessTerminationStat terminationStatus), exitCode); } -void QWebEnginePagePrivate::requestGeometryChange(const QRect &geometry) +void QWebEnginePagePrivate::requestGeometryChange(const QRect &geometry, const QRect &frameGeometry) { + Q_UNUSED(geometry); Q_Q(QWebEnginePage); - Q_EMIT q->geometryChangeRequested(geometry); + Q_EMIT q->geometryChangeRequested(frameGeometry); } void QWebEnginePagePrivate::startDragging(const content::DropData &dropData, diff --git a/src/webenginewidgets/api/qwebenginepage_p.h b/src/webenginewidgets/api/qwebenginepage_p.h index 1724a9dde..2d44d1849 100644 --- a/src/webenginewidgets/api/qwebenginepage_p.h +++ b/src/webenginewidgets/api/qwebenginepage_p.h @@ -135,7 +135,7 @@ public: void moveValidationMessage(const QRect &anchor) override; virtual void renderProcessTerminated(RenderProcessTerminationStatus terminationStatus, int exitCode) override; - void requestGeometryChange(const QRect &geometry) override; + void requestGeometryChange(const QRect &geometry, const QRect &frameGeometry) override; void updateScrollPosition(const QPointF &position) override; void updateContentsSize(const QSizeF &size) override; void startDragging(const content::DropData &dropData, Qt::DropActions allowedActions, diff --git a/src/webenginewidgets/doc/src/qwebenginepage_lgpl.qdoc b/src/webenginewidgets/doc/src/qwebenginepage_lgpl.qdoc index 5248a383a..47370a63c 100644 --- a/src/webenginewidgets/doc/src/qwebenginepage_lgpl.qdoc +++ b/src/webenginewidgets/doc/src/qwebenginepage_lgpl.qdoc @@ -581,6 +581,14 @@ This signal is emitted whenever the document wants to change the position and size of the page to \a geom. This can happen for example through JavaScript. + + \note \l{QWindow::}{setGeometry()} expects a size excluding the window + decoration, while \a geom includes it. You have to remove the size of the frame margins + from \a geom to handle this signal correctly. + + \code + window->setGeometry(geom.marginsRemoved(window->frameMargins())); + \endcode */ /*! -- cgit v1.2.3