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 /src/webenginequick/api/qquickwebengineview.cpp | |
| 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>
Diffstat (limited to 'src/webenginequick/api/qquickwebengineview.cpp')
| -rw-r--r-- | src/webenginequick/api/qquickwebengineview.cpp | 38 |
1 files changed, 33 insertions, 5 deletions
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) |
