From 85be04668e0d4f176ae44da772b9da58dff388e5 Mon Sep 17 00:00:00 2001 From: Michal Klocek Date: Mon, 27 Oct 2025 16:29:21 +0100 Subject: 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 --- src/webenginequick/api/qquickwebengineview.cpp | 38 ++++++++++++++++++++++---- 1 file changed, 33 insertions(+), 5 deletions(-) (limited to 'src/webenginequick/api/qquickwebengineview.cpp') 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) -- cgit v1.2.3