diff options
author | Frederik Gladhorn <frederik.gladhorn@digia.com> | 2013-03-18 15:59:17 +0100 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2013-03-23 14:42:45 +0100 |
commit | 5147b1d4108e36f79aaf4aca539d5cf11726995e (patch) | |
tree | a1213f3dc5967c300824e75f06ec48a7e4b4a132 /src | |
parent | a3304489e870555f5d01d02c0252103db2288898 (diff) |
Accessibility: Fix crash when updating in dtor
This happens for example when running several tests.
Widgets in destructor should be treated as invalid
since their window pointer and other properties are
no longer valid.
When deleting a window containing only a table view
there would be a table model reset update comming from
the window being destroyed.
Change-Id: Ia387c814333ce373fe132b189fc180787e36cdd5
Reviewed-by: Jan Arve Sæther <jan-arve.saether@digia.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/platformsupport/linuxaccessibility/atspiadaptor.cpp | 8 | ||||
-rw-r--r-- | src/plugins/accessible/widgets/itemviews.cpp | 7 | ||||
-rw-r--r-- | src/plugins/accessible/widgets/itemviews.h | 1 | ||||
-rw-r--r-- | src/widgets/accessible/qaccessiblewidget.cpp | 9 | ||||
-rw-r--r-- | src/widgets/accessible/qaccessiblewidget_p.h | 1 | ||||
-rw-r--r-- | src/widgets/kernel/qwidget.h | 2 |
6 files changed, 25 insertions, 3 deletions
diff --git a/src/platformsupport/linuxaccessibility/atspiadaptor.cpp b/src/platformsupport/linuxaccessibility/atspiadaptor.cpp index 001976e9fe..050cb6a0bc 100644 --- a/src/platformsupport/linuxaccessibility/atspiadaptor.cpp +++ b/src/platformsupport/linuxaccessibility/atspiadaptor.cpp @@ -809,9 +809,13 @@ void AtSpiAdaptor::windowActivated(QObject* window, bool active) return; QAccessibleInterface *iface = QAccessible::queryAccessibleInterface(window); - Q_ASSERT(iface && iface->isValid()); + Q_ASSERT(iface); + Q_ASSERT(!active || iface->isValid()); - QString windowTitle = iface->text(QAccessible::Name); + QString windowTitle; + // in dtor it may be invalid + if (iface->isValid()) + windowTitle = iface->text(QAccessible::Name); delete iface; QDBusVariant data; diff --git a/src/plugins/accessible/widgets/itemviews.cpp b/src/plugins/accessible/widgets/itemviews.cpp index cb34116f32..822d9d8c77 100644 --- a/src/plugins/accessible/widgets/itemviews.cpp +++ b/src/plugins/accessible/widgets/itemviews.cpp @@ -47,7 +47,7 @@ #include <qtreeview.h> #include <private/qtreewidget_p.h> #include <QtGui/private/qaccessible2_p.h> -#include <QDebug> +#include <QtWidgets/private/qwidget_p.h> #ifndef QT_NO_ACCESSIBILITY @@ -136,6 +136,11 @@ QAccessibleTable::QAccessibleTable(QWidget *w) } } +bool QAccessibleTable::isValid() const +{ + return (view() && !qobject_cast<QWidget*>(view())->d_func()->data.in_destructor); +} + QAccessibleTable::~QAccessibleTable() { } diff --git a/src/plugins/accessible/widgets/itemviews.h b/src/plugins/accessible/widgets/itemviews.h index bba698bda2..af885fe6c1 100644 --- a/src/plugins/accessible/widgets/itemviews.h +++ b/src/plugins/accessible/widgets/itemviews.h @@ -63,6 +63,7 @@ class QAccessibleTable :public QAccessibleTableInterface, public QAccessibleObje { public: explicit QAccessibleTable(QWidget *w); + bool isValid() const; virtual ~QAccessibleTable(); diff --git a/src/widgets/accessible/qaccessiblewidget.cpp b/src/widgets/accessible/qaccessiblewidget.cpp index 2b8e1a7036..dcbf276356 100644 --- a/src/widgets/accessible/qaccessiblewidget.cpp +++ b/src/widgets/accessible/qaccessiblewidget.cpp @@ -55,6 +55,7 @@ #include <QRubberBand> #include <QFocusFrame> #include <QMenu> +#include <QtWidgets/private/qwidget_p.h> QT_BEGIN_NAMESPACE @@ -152,6 +153,7 @@ QString Q_WIDGETS_EXPORT qt_accHotKey(const QString &text) return QString(); } +// ### inherit QAccessibleObjectPrivate class QAccessibleWidgetPrivate { public: @@ -202,6 +204,13 @@ QAccessibleWidget::QAccessibleWidget(QWidget *w, QAccessible::Role role, const Q d->name = name; } +bool QAccessibleWidget::isValid() const +{ + if (!object() || static_cast<QWidget *>(object())->d_func()->data.in_destructor) + return false; + return QAccessibleObject::isValid(); +} + /*! \reimp */ QWindow *QAccessibleWidget::window() const { diff --git a/src/widgets/accessible/qaccessiblewidget_p.h b/src/widgets/accessible/qaccessiblewidget_p.h index 803dc71409..cb1ce37734 100644 --- a/src/widgets/accessible/qaccessiblewidget_p.h +++ b/src/widgets/accessible/qaccessiblewidget_p.h @@ -56,6 +56,7 @@ class Q_WIDGETS_EXPORT QAccessibleWidget : public QAccessibleObject, public QAcc { public: explicit QAccessibleWidget(QWidget *o, QAccessible::Role r = QAccessible::Client, const QString& name = QString()); + bool isValid() const; QWindow *window() const; int childCount() const; diff --git a/src/widgets/kernel/qwidget.h b/src/widgets/kernel/qwidget.h index 5c844d1566..f90f2ee5f5 100644 --- a/src/widgets/kernel/qwidget.h +++ b/src/widgets/kernel/qwidget.h @@ -704,6 +704,8 @@ private: friend class QStyleSheetStyle; friend struct QWidgetExceptionCleaner; friend class QWidgetWindow; + friend class QAccessibleWidget; + friend class QAccessibleTable; #ifndef QT_NO_GESTURES friend class QGestureManager; friend class QWinNativePanGestureRecognizer; |