diff options
| author | Michal Klocek <michal.klocek@qt.io> | 2025-10-27 16:29:21 +0100 |
|---|---|---|
| committer | Michal Klocek <michal.klocek@qt.io> | 2025-12-01 17:10:58 +0100 |
| commit | 85be04668e0d4f176ae44da772b9da58dff388e5 (patch) | |
| tree | 1d157bc4a517dada1fe646642464d0bbd0f891fa | |
| parent | 76e0c099148167bf90ed659440e3668ce0129a5d (diff) | |
Notify about global mapping changes of QQuickWebEngineView
Chromium needs to be aware of view geometry changes.
We do the sync in visualPropertiesChanged call, which
in turn is called from item geometryChanged and
itemChanged handlers.
However, this approach is not sufficient to track global
geometry changes as it only covers case where geometry change is
local to item's parent.
Therefore, we need watch the entire parent hierarchy
to correctly handle global geometry change notifications.
Note this issue only affects webenginequick as
rwhv can have offset from the scene due to explicit
position or anchoring within other items.
Moreover, anchoring of child item can mean
making offset in parent item.
Add logic to track offset changes of parent items.
Use 'polish' accumulate required notification and
do visualPropertiesChanged() in updatePolish() call.
Fixes: QTBUG-141476
Pick-to: 6.10
Change-Id: Ia35a6f243624cb06b6b45f76abf8ba544790e2c0
Reviewed-by: Peter Varga <pvarga@inf.u-szeged.hu>
| -rw-r--r-- | src/core/render_widget_host_view_qt_delegate_item.cpp | 13 | ||||
| -rw-r--r-- | src/core/render_widget_host_view_qt_delegate_item.h | 2 | ||||
| -rw-r--r-- | src/webenginequick/api/qquickwebengineview.cpp | 38 |
3 files changed, 43 insertions, 10 deletions
diff --git a/src/core/render_widget_host_view_qt_delegate_item.cpp b/src/core/render_widget_host_view_qt_delegate_item.cpp index 8a53636b6..8c7405381 100644 --- a/src/core/render_widget_host_view_qt_delegate_item.cpp +++ b/src/core/render_widget_host_view_qt_delegate_item.cpp @@ -321,7 +321,7 @@ void RenderWidgetHostViewQtDelegateItem::inputMethodEvent(QInputMethodEvent *eve void RenderWidgetHostViewQtDelegateItem::geometryChange(const QRectF &newGeometry, const QRectF &oldGeometry) { QQuickItem::geometryChange(newGeometry, oldGeometry); - m_client->visualPropertiesChanged(); + polish(); } void RenderWidgetHostViewQtDelegateItem::itemChange(ItemChange change, const ItemChangeData &value) @@ -352,7 +352,7 @@ void RenderWidgetHostViewQtDelegateItem::itemChange(ItemChange change, const Ite if (!m_isPopup) m_windowConnections.append(connect(value.window, SIGNAL(closing(QQuickCloseEvent*)), SLOT(onHide()))); } - m_client->visualPropertiesChanged(); + polish(); } else if (change == QQuickItem::ItemVisibleHasChanged) { if (value.boolValue) { m_client->notifyShown(); @@ -364,7 +364,7 @@ void RenderWidgetHostViewQtDelegateItem::itemChange(ItemChange change, const Ite onHide(); } } else if (change == QQuickItem::ItemDevicePixelRatioHasChanged) { - m_client->visualPropertiesChanged(); + polish(); } } @@ -490,6 +490,11 @@ QSGNode *RenderWidgetHostViewQtDelegateItem::updatePaintNode(QSGNode *oldNode, U return node; } +void RenderWidgetHostViewQtDelegateItem::updatePolish() +{ + m_client->visualPropertiesChanged(); +} + void RenderWidgetHostViewQtDelegateItem::onBeforeRendering() { auto comp = compositor(); @@ -508,7 +513,7 @@ void RenderWidgetHostViewQtDelegateItem::onAfterFrameEnd() void RenderWidgetHostViewQtDelegateItem::onWindowPosChanged() { - m_client->visualPropertiesChanged(); + polish(); } void RenderWidgetHostViewQtDelegateItem::onHide() diff --git a/src/core/render_widget_host_view_qt_delegate_item.h b/src/core/render_widget_host_view_qt_delegate_item.h index aceec7912..a4246b8ff 100644 --- a/src/core/render_widget_host_view_qt_delegate_item.h +++ b/src/core/render_widget_host_view_qt_delegate_item.h @@ -74,7 +74,7 @@ public: void setInputMethodHints(Qt::InputMethodHints) override; void setClearColor(const QColor &color) override; void unhandledWheelEvent(QWheelEvent *ev) override; - + void updatePolish() override; void readyToSwap() override; void setWidgetDelegate(WidgetDelegate *delegate); diff --git a/src/webenginequick/api/qquickwebengineview.cpp b/src/webenginequick/api/qquickwebengineview.cpp index a2c8816bf..bb573609f 100644 --- a/src/webenginequick/api/qquickwebengineview.cpp +++ b/src/webenginequick/api/qquickwebengineview.cpp @@ -1859,19 +1859,47 @@ void QQuickWebEngineView::geometryChange(const QRectF &newGeometry, const QRectF { QQuickItem::geometryChange(newGeometry, oldGeometry); Q_D(QQuickWebEngineView); - if (d->delegateItem) + if (d->delegateItem) { d->delegateItem->setSize(newGeometry.size()); + // this handles notifications of local offset changes + d->delegateItem->polish(); + } } void QQuickWebEngineView::itemChange(ItemChange change, const ItemChangeData &value) { - Q_D(QQuickWebEngineView); - if (d && d->profileInitialized() && d->adapter->isInitialized() + QQuickItem::itemChange(change, value); + if (!d_ptr) // see releaseProfile() + return; + if (d_ptr->profileInitialized() && d_ptr->adapter->isInitialized() && (change == ItemSceneChange || change == ItemVisibleHasChanged)) { if (window()) - d->adapter->setVisible(isVisible()); + d_ptr->adapter->setVisible(isVisible()); + } + if (change == ItemParentHasChanged) { + // track global offset changes + QQuickItem *item = value.item; + // detach + while (item) { + disconnect(item, nullptr, this, nullptr); + item = item->parentItem(); + } + // attach + item = parentItem(); + while (item) { + connect(item, &QQuickItem::xChanged, this, [this]() { + if (d_ptr && d_ptr->delegateItem) + d_ptr->delegateItem->polish(); + }); + connect(item, &QQuickItem::yChanged, this, [this]() { + if (d_ptr && d_ptr->delegateItem) + d_ptr->delegateItem->polish(); + }); + item = item->parentItem(); + } + if (d_ptr->delegateItem) + d_ptr->delegateItem->polish(); } - QQuickItem::itemChange(change, value); } void QQuickWebEngineView::acceptAsNewWindow(QWebEngineNewWindowRequest *request) |
