diff options
-rw-r--r-- | examples/webengine/quicknanobrowser/BrowserDialog.qml | 12 | ||||
-rw-r--r-- | examples/webenginewidgets/simplebrowser/webpopupwindow.cpp | 7 | ||||
-rw-r--r-- | src/core/render_widget_host_view_qt.cpp | 1 | ||||
-rw-r--r-- | src/core/render_widget_host_view_qt.h | 1 | ||||
-rw-r--r-- | src/core/web_contents_adapter_client.h | 2 | ||||
-rw-r--r-- | src/core/web_contents_delegate_qt.cpp | 10 | ||||
-rw-r--r-- | src/webengine/api/qquickwebengineview.cpp | 6 | ||||
-rw-r--r-- | src/webengine/api/qquickwebengineview_p.h | 1 | ||||
-rw-r--r-- | src/webengine/api/qquickwebengineview_p_p.h | 2 | ||||
-rw-r--r-- | src/webengine/doc/src/webengineview.qdoc | 22 | ||||
-rw-r--r-- | src/webenginewidgets/api/qwebenginepage.cpp | 5 | ||||
-rw-r--r-- | src/webenginewidgets/api/qwebenginepage_p.h | 2 | ||||
-rw-r--r-- | src/webenginewidgets/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 <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 */ /*! |