From 80872d0a450d4179e66121d8efe01929ad56fb05 Mon Sep 17 00:00:00 2001 From: Frederik Gladhorn Date: Fri, 23 Mar 2012 17:42:09 +0100 Subject: [PATCH] Create accessible interfaces only for items with attached prop MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit If the attached property is not found, ignore the item, unless it is part of the tree. We still create a valid hierarchy this way, but filter out all irrelevant items. The same goes for hit-testing. On the other hand this patch enables the root item to be found by setting isAccessible on it when updating the flags. Otherwise the hierarchy is not valid again. Change-Id: Ied422fd0506d13458757c87a5dad7cdb9d3079bf Reviewed-by: Jan-Arve Sæther --- src/plugins/accessible/quick/main.cpp | 6 +++++- src/plugins/accessible/quick/qaccessiblequickview.cpp | 7 ++++++- src/quick/items/qquickitem.cpp | 3 --- tests/auto/quick/qquickaccessible/tst_qquickaccessible.cpp | 12 +++++++----- 4 files changed, 18 insertions(+), 10 deletions(-) diff --git a/src/plugins/accessible/quick/main.cpp b/src/plugins/accessible/quick/main.cpp index 2c75e59..6592c59 100644 --- a/src/plugins/accessible/quick/main.cpp +++ b/src/plugins/accessible/quick/main.cpp @@ -46,6 +46,7 @@ #include #include +#include #include #include @@ -86,8 +87,11 @@ QAccessibleInterface *AccessibleQuickFactory::create(const QString &classname, Q if (classname == QLatin1String("QQuickView")) { return new QAccessibleQuickView(qobject_cast(object)); // FIXME } else if (classname == QLatin1String("QQuickItem")) { - QQuickItem * item = qobject_cast(object); + QQuickItem *item = qobject_cast(object); Q_ASSERT(item); + QQuickItemPrivate *itemPrivate = QQuickItemPrivate::get(item); + if (!itemPrivate->isAccessible) + return 0; QVariant v = QQuickAccessibleAttached::property(item, "role"); bool ok; diff --git a/src/plugins/accessible/quick/qaccessiblequickview.cpp b/src/plugins/accessible/quick/qaccessiblequickview.cpp index 2df1f24..ed8167f 100644 --- a/src/plugins/accessible/quick/qaccessiblequickview.cpp +++ b/src/plugins/accessible/quick/qaccessiblequickview.cpp @@ -127,7 +127,11 @@ static QQuickItem *childAt_helper(QQuickItem *item, int x, int y) } QScopedPointer accessibleInterface(QAccessible::queryAccessibleInterface(item)); - if (accessibleInterface && accessibleInterface->childCount() == 0) { + // this item has no Accessible attached property + if (!accessibleInterface) + return 0; + + if (accessibleInterface->childCount() == 0) { return (itemScreenRect(item).contains(x, y)) ? item : 0; } @@ -155,6 +159,7 @@ QAccessibleInterface *QAccessibleQuickView::childAt(int x, int y) const if (root) { if (QQuickItem *item = childAt_helper(root, x, y)) return QAccessible::queryAccessibleInterface(item); + return QAccessible::queryAccessibleInterface(root); } return 0; } diff --git a/src/quick/items/qquickitem.cpp b/src/quick/items/qquickitem.cpp index d2a8ada..c5a2b44 100644 --- a/src/quick/items/qquickitem.cpp +++ b/src/quick/items/qquickitem.cpp @@ -1633,9 +1633,6 @@ void QQuickItemPrivate::setAccessibleFlagAndListener() if (item->d_func()->isAccessible) break; // already set - grandparents should have the flag set as well. - if (item->canvas() && item->canvas()->rootItem() == item) - break; // don't add a listener to the canvas root item - item->d_func()->isAccessible = true; item = item->d_func()->parentItem; } diff --git a/tests/auto/quick/qquickaccessible/tst_qquickaccessible.cpp b/tests/auto/quick/qquickaccessible/tst_qquickaccessible.cpp index ca04751..45a9d11 100644 --- a/tests/auto/quick/qquickaccessible/tst_qquickaccessible.cpp +++ b/tests/auto/quick/qquickaccessible/tst_qquickaccessible.cpp @@ -345,15 +345,17 @@ void tst_QQuickAccessible::hitTest() QAI rootItem = QAI(canvasIface->child(0)); QRect rootRect = rootItem->rect(); - // hit the root item - QAI rootItemIface(canvasIface->childAt(rootRect.x() + 200, rootRect.y() + 50)); - QVERIFY(rootItemIface); - QCOMPARE(rootRect, rootItemIface->rect()); + // check the root item from app + QAI appIface = QAI(QAccessible::queryAccessibleInterface(qApp)); + QVERIFY(appIface); + QAI itemHit(appIface->childAt(rootRect.x() + 200, rootRect.y() + 50)); + QVERIFY(itemHit); + QCOMPARE(rootRect, itemHit->rect()); // hit rect1 QAI rect1(rootItem->child(0)); QRect rect1Rect = rect1->rect(); - rootItemIface = QAI(rootItem->childAt(rect1Rect.x() + 10, rect1Rect.y() + 10)); + QAI rootItemIface = QAI(rootItem->childAt(rect1Rect.x() + 10, rect1Rect.y() + 10)); QVERIFY(rootItemIface); QCOMPARE(rect1Rect, rootItemIface->rect()); QCOMPARE(rootItemIface->text(QAccessible::Name), QLatin1String("rect1")); -- 2.7.4