summaryrefslogtreecommitdiffstats
path: root/src/webenginewidgets/render_widget_host_view_qt_delegate_widget.cpp
diff options
context:
space:
mode:
authorPeter Varga <pvarga@inf.u-szeged.hu>2020-02-20 10:57:37 +0100
committerPeter Varga <pvarga@inf.u-szeged.hu>2020-02-27 20:47:44 +0100
commita44d7aeef75c73ede4fb21df91f8e7d173d95c68 (patch)
tree6398141ebfd10c5d14c6b8e3a12eb9aa47190e21 /src/webenginewidgets/render_widget_host_view_qt_delegate_widget.cpp
parentc0db708f0876ede1f6feb0f3d87d05c2f32b729f (diff)
Invalidate accessible interfaces on destruction of view or page
The RenderWidgetHostViewQtDelegate(Widget|Quick)Accessible interfaces are forwarding their queries to the WebEngineView. In case of widget, the view also forwards the query to the page. The accessible interfaces may outlive the view and page. The interfaces are not supposed to be used after the destruction of the underlying objects. Thus, set the RenderWidgetHostViewQtDelegate and WebEngineView accessible interfaces invalid if the corresponding pointers are null. Also fix querying the root accessible interface of the web page when the render frame host is not available. This fixes crash when QT_LOGGING_RULES="qt.accessibility.cache.debug=true" is set and logger tries to pretty-print QAccessibleInterfaces during destruction. Task-number: QTBUG-78284 Change-Id: If18af0605061fcd82d019d0042dbf1c9d3a910be Reviewed-by: Kirill Burtsev <kirill.burtsev@qt.io>
Diffstat (limited to 'src/webenginewidgets/render_widget_host_view_qt_delegate_widget.cpp')
-rw-r--r--src/webenginewidgets/render_widget_host_view_qt_delegate_widget.cpp22
1 files changed, 18 insertions, 4 deletions
diff --git a/src/webenginewidgets/render_widget_host_view_qt_delegate_widget.cpp b/src/webenginewidgets/render_widget_host_view_qt_delegate_widget.cpp
index 8ba312822..fdd6d1c4f 100644
--- a/src/webenginewidgets/render_widget_host_view_qt_delegate_widget.cpp
+++ b/src/webenginewidgets/render_widget_host_view_qt_delegate_widget.cpp
@@ -41,6 +41,7 @@
#include "qwebenginepage_p.h"
#include "qwebengineview.h"
+#include "qwebengineview_p.h"
#include <QGuiApplication>
#include <QLayout>
#include <QMouseEvent>
@@ -490,24 +491,37 @@ RenderWidgetHostViewQtDelegateWidgetAccessible::RenderWidgetHostViewQtDelegateWi
{
}
+bool RenderWidgetHostViewQtDelegateWidgetAccessible::isValid() const
+{
+ if (!viewAccessible() || !viewAccessible()->isValid())
+ return false;
+
+ return QAccessibleWidget::isValid();
+}
+
QAccessibleInterface *RenderWidgetHostViewQtDelegateWidgetAccessible::focusChild() const
{
- return QAccessible::queryAccessibleInterface(m_view)->focusChild();
+ return viewAccessible()->focusChild();
}
int RenderWidgetHostViewQtDelegateWidgetAccessible::childCount() const
{
- return QAccessible::queryAccessibleInterface(m_view)->childCount();
+ return viewAccessible()->childCount();
}
QAccessibleInterface *RenderWidgetHostViewQtDelegateWidgetAccessible::child(int index) const
{
- return QAccessible::queryAccessibleInterface(m_view)->child(index);
+ return viewAccessible()->child(index);
}
int RenderWidgetHostViewQtDelegateWidgetAccessible::indexOfChild(const QAccessibleInterface *c) const
{
- return QAccessible::queryAccessibleInterface(m_view)->indexOfChild(c);
+ return viewAccessible()->indexOfChild(c);
+}
+
+QWebEngineViewAccessible *RenderWidgetHostViewQtDelegateWidgetAccessible::viewAccessible() const
+{
+ return static_cast<QWebEngineViewAccessible *>(QAccessible::queryAccessibleInterface(m_view));
}
#endif // QT_CONFIG(accessibility)