summaryrefslogtreecommitdiffstats
path: root/src/webenginequick/api/qquickwebengineview.cpp
diff options
context:
space:
mode:
authorMichal Klocek <michal.klocek@qt.io>2025-10-27 16:29:21 +0100
committerMichal Klocek <michal.klocek@qt.io>2025-12-01 17:10:58 +0100
commit85be04668e0d4f176ae44da772b9da58dff388e5 (patch)
tree1d157bc4a517dada1fe646642464d0bbd0f891fa /src/webenginequick/api/qquickwebengineview.cpp
parent76e0c099148167bf90ed659440e3668ce0129a5d (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.cpp38
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)