summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSzabolcs David <davidsz@inf.u-szeged.hu>2017-06-08 15:48:55 +0200
committerSzabolcs David <davidsz@inf.u-szeged.hu>2017-10-05 08:48:51 +0000
commit4c1cde9a1909162fbddeabd958a5f5acc43c83d6 (patch)
tree2e0a1c0117f16a7cc0b2c5729e14cf32a7fb0532
parent3be9a0591f2cf0dac2efa79ea3f2a606afebb5b4 (diff)
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 <allan.jensen@qt.io>
-rw-r--r--examples/webengine/quicknanobrowser/BrowserDialog.qml12
-rw-r--r--examples/webenginewidgets/simplebrowser/webpopupwindow.cpp7
-rw-r--r--src/core/render_widget_host_view_qt.cpp1
-rw-r--r--src/core/render_widget_host_view_qt.h1
-rw-r--r--src/core/web_contents_adapter_client.h2
-rw-r--r--src/core/web_contents_delegate_qt.cpp10
-rw-r--r--src/webengine/api/qquickwebengineview.cpp6
-rw-r--r--src/webengine/api/qquickwebengineview_p.h1
-rw-r--r--src/webengine/api/qquickwebengineview_p_p.h2
-rw-r--r--src/webengine/doc/src/webengineview.qdoc22
-rw-r--r--src/webenginewidgets/api/qwebenginepage.cpp5
-rw-r--r--src/webenginewidgets/api/qwebenginepage_p.h2
-rw-r--r--src/webenginewidgets/doc/src/qwebenginepage_lgpl.qdoc8
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 <QIcon>
#include <QLineEdit>
#include <QVBoxLayout>
+#include <QWindow>
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<CertificateErrorController> &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 <QDesktopServices>
#include <QTimer>
+#include <QWindow>
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<RenderWidgetHostViewQt*>(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
*/
/*!