summaryrefslogtreecommitdiffstats
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
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>
-rw-r--r--src/core/render_widget_host_view_qt_delegate_item.cpp13
-rw-r--r--src/core/render_widget_host_view_qt_delegate_item.h2
-rw-r--r--src/webenginequick/api/qquickwebengineview.cpp38
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)