From 6d9541ae96441d849e87d763a636b8f36b416764 Mon Sep 17 00:00:00 2001 From: Frederik Gladhorn Date: Mon, 18 Mar 2013 20:22:52 +0100 Subject: Do not update accessibility for invalid interfaces MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: I8dc29ea51393406e529c76f25bf2f8cf426e26cf Reviewed-by: Jan Arve Sæther --- .../windows/accessible/qwindowsaccessibility.cpp | 4 +++- src/widgets/accessible/qaccessiblewidget.cpp | 3 +++ tests/auto/other/qaccessibility/tst_qaccessibility.cpp | 18 ++++++++++++++++++ 3 files changed, 24 insertions(+), 1 deletion(-) diff --git a/src/plugins/platforms/windows/accessible/qwindowsaccessibility.cpp b/src/plugins/platforms/windows/accessible/qwindowsaccessibility.cpp index 752b9e7c20..146b114389 100644 --- a/src/plugins/platforms/windows/accessible/qwindowsaccessibility.cpp +++ b/src/plugins/platforms/windows/accessible/qwindowsaccessibility.cpp @@ -169,7 +169,9 @@ void QWindowsAccessibility::notifyAccessibilityUpdate(QAccessibleEvent *event) // An event has to be associated with a window, // so find the first parent that is a widget and that has a WId QAccessibleInterface *iface = event->accessibleInterface(); - QWindow *window = iface ? QWindowsAccessibility::windowHelper(iface) : 0; + if (!iface) // ### This should not happen, maybe make it an assert. + return; + QWindow *window = QWindowsAccessibility::windowHelper(iface); delete iface; if (!window) { diff --git a/src/widgets/accessible/qaccessiblewidget.cpp b/src/widgets/accessible/qaccessiblewidget.cpp index 5c8d3e3a57..2b8e1a7036 100644 --- a/src/widgets/accessible/qaccessiblewidget.cpp +++ b/src/widgets/accessible/qaccessiblewidget.cpp @@ -205,6 +205,7 @@ QAccessibleWidget::QAccessibleWidget(QWidget *w, QAccessible::Role role, const Q /*! \reimp */ QWindow *QAccessibleWidget::window() const { + Q_ASSERT(widget()); return widget()->windowHandle(); } @@ -343,6 +344,7 @@ QAccessibleWidget::relations(QAccessible::Relation match /*= QAccessible::AllRel /*! \reimp */ QAccessibleInterface *QAccessibleWidget::parent() const { + Q_ASSERT(widget()); QObject *parentWidget= widget()->parentWidget(); if (!parentWidget) parentWidget = qApp; @@ -352,6 +354,7 @@ QAccessibleInterface *QAccessibleWidget::parent() const /*! \reimp */ QAccessibleInterface *QAccessibleWidget::child(int index) const { + Q_ASSERT(widget()); QWidgetList childList = childWidgets(widget()); if (index >= 0 && index < childList.size()) return QAccessible::queryAccessibleInterface(childList.at(index)); diff --git a/tests/auto/other/qaccessibility/tst_qaccessibility.cpp b/tests/auto/other/qaccessibility/tst_qaccessibility.cpp index f5f336ed64..ce8032e0c3 100644 --- a/tests/auto/other/qaccessibility/tst_qaccessibility.cpp +++ b/tests/auto/other/qaccessibility/tst_qaccessibility.cpp @@ -364,6 +364,24 @@ void tst_QAccessibility::eventTest() QVERIFY(QTestAccessibility::containsEvent(&hideEvent)); delete button; + + // Make sure that invalid events don't bring down the system + // these events can be in user code. + QWidget *widget = new QWidget(); + QAccessibleEvent ev1(widget, QAccessible::Focus); + QAccessible::updateAccessibility(&ev1); + + QAccessibleEvent ev2(widget, QAccessible::Focus); + ev2.setChild(7); + QAccessible::updateAccessibility(&ev2); + delete widget; + + QObject *object = new QObject(); + QAccessibleEvent ev3(widget, QAccessible::Focus); + QAccessible::updateAccessibility(&ev3); + delete object; + + QTestAccessibility::clearEvents(); } -- cgit v1.2.3