summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTor Arne Vestbø <tor.arne.vestbo@digia.com>2014-09-03 13:47:42 +0200
committerTor Arne Vestbø <tor.arne.vestbo@digia.com>2014-09-20 00:21:30 +0200
commitbbacf3d79d5067c4f9351400b5c1e0028cd093a5 (patch)
tree2618771ee6728deffb9dc3bc850c993d66331f87
parent076d22efa63de107d36ec33d978e6365f70a1f15 (diff)
a11y: Don't try to update accessibility if there's no interface
Change-Id: I970729e65ba0eb857e6974f9947f27ae8e6410c3 Reviewed-by: Frederik Gladhorn <frederik.gladhorn@digia.com>
-rw-r--r--src/gui/accessible/qaccessible.cpp15
-rw-r--r--tests/auto/other/qaccessibility/tst_qaccessibility.cpp26
2 files changed, 18 insertions, 23 deletions
diff --git a/src/gui/accessible/qaccessible.cpp b/src/gui/accessible/qaccessible.cpp
index 50f023ec78..1d70598c39 100644
--- a/src/gui/accessible/qaccessible.cpp
+++ b/src/gui/accessible/qaccessible.cpp
@@ -861,15 +861,20 @@ void QAccessible::setRootObject(QObject *object)
*/
void QAccessible::updateAccessibility(QAccessibleEvent *event)
{
- if (!isActive())
+ // NOTE: Querying for the accessibleInterface below will result in
+ // resolving and caching the interface, which in some cases will
+ // cache the wrong information as updateAccessibility is called
+ // during construction of widgets. If you see cases where the
+ // cache seems wrong, this call is "to blame", but the code that
+ // caches dynamic data should be updated to handle change events.
+ if (!isActive() || !event->accessibleInterface())
return;
#ifndef QT_NO_ACCESSIBILITY
if (event->type() == QAccessible::TableModelChanged) {
- if (QAccessibleInterface *iface = event->accessibleInterface()) {
- if (iface->tableInterface())
- iface->tableInterface()->modelChange(static_cast<QAccessibleTableModelChangeEvent*>(event));
- }
+ QAccessibleInterface *iface = event->accessibleInterface();
+ if (iface && iface->tableInterface())
+ iface->tableInterface()->modelChange(static_cast<QAccessibleTableModelChangeEvent*>(event));
}
if (updateHandler) {
diff --git a/tests/auto/other/qaccessibility/tst_qaccessibility.cpp b/tests/auto/other/qaccessibility/tst_qaccessibility.cpp
index ac90f6ea72..653cc6b9d9 100644
--- a/tests/auto/other/qaccessibility/tst_qaccessibility.cpp
+++ b/tests/auto/other/qaccessibility/tst_qaccessibility.cpp
@@ -939,29 +939,19 @@ void tst_QAccessibility::mainWindowTest()
window.show();
QTRY_VERIFY(QGuiApplication::focusWindow() == &window);
-// We currently don't have an accessible interface for QWindow
-// the active state is either in the QMainWindow or QQuickView
-// QAccessibleInterface *windowIface(QAccessible::queryAccessibleInterface(&window));
-// QVERIFY(windowIface->state().active);
+ // We currently don't have an accessible interface for QWindow
+ // the active state is either in the QMainWindow or QQuickView
+ QAccessibleInterface *windowIface(QAccessible::queryAccessibleInterface(&window));
+ QVERIFY(!windowIface);
QAccessible::State activeState;
activeState.active = true;
- QAccessibleStateChangeEvent active(&window, activeState);
- QVERIFY_EVENT(&active);
-
- QWindow child;
- child.setParent(&window);
- child.setGeometry(10, 10, 20, 20);
- child.show();
-
- child.requestActivate();
- QTRY_VERIFY(QGuiApplication::focusWindow() == &child);
+ // We should still not crash if we somehow end up sending state change events
+ // Note that we do not QVERIFY_EVENT, as that relies on the updateHandler being
+ // called, which does not happen/make sense when there's no interface for the event.
+ QAccessibleStateChangeEvent active(&window, activeState);
QAccessibleStateChangeEvent deactivate(&window, activeState);
- QVERIFY_EVENT(&deactivate); // deactivation of parent
-
- QAccessibleStateChangeEvent activeChild(&child, activeState);
- QVERIFY_EVENT(&activeChild);
}
}