From 74448afd03ee93c8ecbd9d18995c9b7d1d652494 Mon Sep 17 00:00:00 2001 From: Frederik Gladhorn Date: Tue, 4 Oct 2011 14:20:05 +0200 Subject: Use child/parent function in QAccessibleWidget and test. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This also uncovered a missing implementation of child for dock widgets. Change-Id: Iac4c5a51d4626769af11b277a9a345e1e31dc490 Reviewed-on: http://codereview.qt-project.org/5987 Reviewed-by: Jan-Arve Sæther --- src/gui/accessible/qaccessibleobject.cpp | 3 +- .../accessible/widgets/qaccessiblewidgets.cpp | 23 ++-- .../accessible/widgets/qaccessiblewidgets.h | 2 +- src/widgets/accessible/qaccessiblewidget.cpp | 22 ++- tests/auto/qaccessibility/tst_qaccessibility.cpp | 147 +++++++-------------- 5 files changed, 70 insertions(+), 127 deletions(-) diff --git a/src/gui/accessible/qaccessibleobject.cpp b/src/gui/accessible/qaccessibleobject.cpp index 8d90390e28..f7d6c3c72b 100644 --- a/src/gui/accessible/qaccessibleobject.cpp +++ b/src/gui/accessible/qaccessibleobject.cpp @@ -291,7 +291,6 @@ QAccessibleInterface *QAccessibleApplication::parent() const QAccessibleInterface *QAccessibleApplication::child(int index) const { - Q_ASSERT(index >= 0); const QObjectList tlo(topLevelObjects()); if (index >= 0 && index < tlo.count()) return QAccessible::queryAccessibleInterface(tlo.at(index)); @@ -299,7 +298,7 @@ QAccessibleInterface *QAccessibleApplication::child(int index) const } /*! \reimp */ -int QAccessibleApplication::navigate(RelationFlag relation, int entry, +int QAccessibleApplication::navigate(RelationFlag relation, int, QAccessibleInterface **target) const { if (!target) diff --git a/src/plugins/accessible/widgets/qaccessiblewidgets.cpp b/src/plugins/accessible/widgets/qaccessiblewidgets.cpp index 22644aad2b..676d140eb0 100644 --- a/src/plugins/accessible/widgets/qaccessiblewidgets.cpp +++ b/src/plugins/accessible/widgets/qaccessiblewidgets.cpp @@ -1267,21 +1267,14 @@ QAccessibleDockWidget::QAccessibleDockWidget(QWidget *widget) } -int QAccessibleDockWidget::navigate(RelationFlag relation, int entry, QAccessibleInterface **iface) const -{ - if (relation == Child) { - if (entry == 1) { - *iface = new QAccessibleTitleBar(dockWidget()); - return 0; - } else if (entry == 2) { - if (dockWidget()->widget()) - *iface = QAccessible::queryAccessibleInterface(dockWidget()->widget()); - return 0; - } - *iface = 0; - return -1; +QAccessibleInterface *QAccessibleDockWidget::child(int index) const +{ + if (index == 0) { + return new QAccessibleTitleBar(dockWidget()); + } else if (index == 1 && dockWidget()->widget()) { + return QAccessible::queryAccessibleInterface(dockWidget()->widget()); } - return QAccessibleWidget::navigate(relation, entry, iface); + return 0; } int QAccessibleDockWidget::childAt(int x, int y) const @@ -1332,7 +1325,7 @@ QAccessible::State QAccessibleDockWidget::state(int child) const return QAccessibleWidget::state(child); } -QRect QAccessibleDockWidget::rect (int child ) const +QRect QAccessibleDockWidget::rect(int child) const { QRect rect; bool mapToGlobal = true; diff --git a/src/plugins/accessible/widgets/qaccessiblewidgets.h b/src/plugins/accessible/widgets/qaccessiblewidgets.h index 8d0a13a04a..b82df2f234 100644 --- a/src/plugins/accessible/widgets/qaccessiblewidgets.h +++ b/src/plugins/accessible/widgets/qaccessiblewidgets.h @@ -250,7 +250,7 @@ class QAccessibleDockWidget: public QAccessibleWidget { public: explicit QAccessibleDockWidget(QWidget *widget); - int navigate(RelationFlag relation, int entry, QAccessibleInterface **iface) const; + QAccessibleInterface *child(int index) const; int indexOfChild(const QAccessibleInterface *child) const; int childCount() const; QRect rect (int child ) const; diff --git a/src/widgets/accessible/qaccessiblewidget.cpp b/src/widgets/accessible/qaccessiblewidget.cpp index e2c867ea96..65a067e8d0 100644 --- a/src/widgets/accessible/qaccessiblewidget.cpp +++ b/src/widgets/accessible/qaccessiblewidget.cpp @@ -407,7 +407,7 @@ QAccessible::Relation QAccessibleWidget::relationTo(int child, QRect sg = sibIface->rect(0); if (wg.intersects(sg)) { QAccessibleInterface *pIface = 0; - sibIface->navigate(Ancestor, 1, &pIface); + pIface = sibIface->parent(); if (pIface && !((sibIface->state(0) | state(0)) & Invisible)) { int wi = pIface->indexOfChild(this); int si = pIface->indexOfChild(sibIface); @@ -488,7 +488,7 @@ int QAccessibleWidget::navigate(RelationFlag relation, int entry, if (!iface) return -1; - iface->navigate(Child, entry, target); + *target = iface->child(entry - 1); delete iface; if (*target) return 0; @@ -594,8 +594,8 @@ int QAccessibleWidget::navigate(RelationFlag relation, int entry, int sibCount = pIface->childCount(); QAccessibleInterface *sibling = 0; for (int i = pIface->indexOfChild(this) + 1; i <= sibCount && entry; ++i) { - pIface->navigate(Child, i, &sibling); - if (!sibling || (sibling->state(0) & Invisible)) { + sibling = pIface->child(i - 1); + if (!sibling || (sibling->state() & Invisible)) { delete sibling; sibling = 0; continue; @@ -623,7 +623,7 @@ int QAccessibleWidget::navigate(RelationFlag relation, int entry, int index = pIface->indexOfChild(this); QAccessibleInterface *sibling = 0; for (int i = 1; i < index && entry; ++i) { - pIface->navigate(Child, i, &sibling); + sibling = pIface->child(i - 1); Q_ASSERT(sibling); if (!sibling || (sibling->state(0) & Invisible)) { delete sibling; @@ -680,16 +680,14 @@ int QAccessibleWidget::navigate(RelationFlag relation, int entry, int sibCount = pIface->childCount(); QAccessibleInterface *candidate = 0; for (int i = 0; i < sibCount && entry; ++i) { - const int childId = pIface->navigate(Child, i+1, &candidate); - Q_ASSERT(childId >= 0); - if (childId > 0) - candidate = pIface; - if (candidate->relationTo(childId, this, 0) & Label) + candidate = pIface->child(i); + Q_ASSERT(candidate); + if (candidate->relationTo(0, this, 0) & Label) --entry; if (!entry) break; - if (candidate != pIface) - delete candidate; + + delete candidate; candidate = 0; } if (!candidate) { diff --git a/tests/auto/qaccessibility/tst_qaccessibility.cpp b/tests/auto/qaccessibility/tst_qaccessibility.cpp index 2ecf270473..45b093c9d3 100644 --- a/tests/auto/qaccessibility/tst_qaccessibility.cpp +++ b/tests/auto/qaccessibility/tst_qaccessibility.cpp @@ -162,23 +162,22 @@ static inline int indexOfChild(QAccessibleInterface *parentInterface, QWidget *c static int verifyHierarchy(QAccessibleInterface *iface) { int errorAt = 0; - int entry = 0; static int treelevel = 0; // for error diagnostics QAccessibleInterface *middleChild, *if2; middleChild = 0; ++treelevel; int middle = iface->childCount()/2 + 1; if (iface->childCount() >= 2) { - entry = iface->navigate(QAccessible::Child, middle, &middleChild); + middleChild = iface->child(middle - 1); } for (int i = 0; i < iface->childCount() && !errorAt; ++i) { - entry = iface->navigate(QAccessible::Child, i + 1, &if2); - if (entry == 0) { - // navigate Ancestor... - QAccessibleInterface *parent = 0; - entry = if2->navigate(QAccessible::Ancestor, 1, &parent); - EXPECT(entry == 0 && iface->object() == parent->object()); - delete parent; + if2 = iface->child(i); + EXPECT(if2 != 0); + // navigate Ancestor... + QAccessibleInterface *parent = 0; + parent = if2->parent(); + EXPECT(iface->object() == parent->object()); + delete parent; // navigate Sibling... // if (middleChild) { @@ -189,13 +188,10 @@ static int verifyHierarchy(QAccessibleInterface *iface) // EXPECT(iface->indexOfChild(middleChild) == middle); // } - // verify children... - if (!errorAt) - errorAt = verifyHierarchy(if2); - delete if2; - } else { - // leaf nodes - } + // verify children... + if (!errorAt) + errorAt = verifyHierarchy(if2); + delete if2; } delete middleChild; @@ -502,9 +498,9 @@ void tst_QAccessibility::navigateGeometric() // test invisible widget target = QAccessible::queryAccessibleInterface(aw); - QVERIFY(!(target->state(0) & QAccessible::Invisible)); + QVERIFY(!(target->state() & QAccessible::Invisible)); aw->hide(); - QVERIFY(target->state(0) & QAccessible::Invisible); + QVERIFY(target->state() & QAccessible::Invisible); delete target; target = 0; aw->move(center->x() + 10, center->y()); @@ -711,15 +707,14 @@ void tst_QAccessibility::navigateHierarchy() QVERIFY(target == 0); QCOMPARE(iface->navigate(QAccessible::Sibling, 42, &target), -1); QVERIFY(target == 0); - QCOMPARE(iface->navigate(QAccessible::Child, 15, &target), -1); - QVERIFY(iface->child(15) == 0); + + target = iface->child(14); QVERIFY(target == 0); - QCOMPARE(iface->navigate(QAccessible::Child, 0, &target), -1); - QVERIFY(iface->child(-1) == 0); + target = iface->child(-1); QVERIFY(target == 0); - QCOMPARE(iface->navigate(QAccessible::Child, 1, &target), 0); + target = iface->child(0); QAccessibleInterface *interfaceW1 = iface->child(0); - QVERIFY(target != 0); + QVERIFY(target); QVERIFY(target->isValid()); QCOMPARE(target->object(), (QObject*)w1); QVERIFY(interfaceW1 != 0); @@ -745,7 +740,7 @@ void tst_QAccessibility::navigateHierarchy() QCOMPARE(target->object(), (QObject*)w3); delete iface; iface = 0; - QCOMPARE(target->navigate(QAccessible::Child, 1, &iface), 0); + iface = target->child(0); QVERIFY(iface != 0); QVERIFY(iface->isValid()); QCOMPARE(iface->object(), (QObject*)w31); @@ -1207,19 +1202,11 @@ void tst_QAccessibility::buttonTest() void tst_QAccessibility::scrollBarTest() { - // Test that when we hide() a slider, the PageLeft, Indicator, and PageRight also gets the - // Invisible state bit set. - enum SubControls { LineUp = 1, - PageUp = 2, - Position = 3, - PageDown = 4, - LineDown = 5 - }; - - QScrollBar *scrollBar = new QScrollBar(); + QScrollBar *scrollBar = new QScrollBar(Qt::Horizontal); QAccessibleInterface * const scrollBarInterface = QAccessible::queryAccessibleInterface(scrollBar); QVERIFY(scrollBarInterface); QVERIFY(scrollBarInterface->state() & QAccessible::Invisible); + scrollBar->resize(200, 50); scrollBar->show(); QVERIFY(scrollBarInterface->state() ^ QAccessible::Invisible); QVERIFY(QTestAccessibility::events().contains(QTestAccessibilityEvent(scrollBar, 0, QAccessible::ObjectShow))); @@ -1248,39 +1235,13 @@ void tst_QAccessibility::scrollBarTest() valueIface->setCurrentValue(77); QCOMPARE(77, scrollBar->value()); - delete scrollBarInterface; - delete scrollBar; + const QRect scrollBarRect = scrollBarInterface->rect(); + QVERIFY(scrollBarRect.isValid()); + qDebug() << scrollBarRect; - // Test that the rects are ok. - { - QScrollBar *scrollBar = new QScrollBar(Qt::Horizontal); - scrollBar->resize(200, 50); - scrollBar->show(); -#if defined(Q_OS_UNIX) - QCoreApplication::processEvents(); - QTest::qWait(100); -#endif - QAccessibleInterface * const scrollBarInterface = QAccessible::queryAccessibleInterface(scrollBar); - QVERIFY(scrollBarInterface); - - scrollBar->setMinimum(0); - scrollBar->setMaximum(100); - scrollBar->setValue(50); - - QApplication::processEvents(); - - const QRect scrollBarRect = scrollBarInterface->rect(0); - QVERIFY(scrollBarRect.isValid()); - // Verify that the sub-control rects are valid and inside the scrollBar rect. - for (int i = LineUp; i <= LineDown; ++i) { - const QRect testRect = scrollBarInterface->rect(i); - QVERIFY(testRect.isValid()); - QVERIFY(scrollBarRect.contains(testRect)); - } - delete scrollBarInterface; - delete scrollBar; - } + delete scrollBarInterface; + delete scrollBar; QTestAccessibility::clearEvents(); } @@ -2262,7 +2223,7 @@ void tst_QAccessibility::dialogButtonBoxTest() QStringList actualOrder; QAccessibleInterface *child; QAccessibleInterface *leftmost; - iface->navigate(QAccessible::Child, 1, &child); + child = iface->child(0); // first find the leftmost button while (child->navigate(QAccessible::Left, 1, &leftmost) != -1) { delete child; @@ -2321,7 +2282,7 @@ void tst_QAccessibility::dialogButtonBoxTest() QApplication::processEvents(); QAccessibleInterface *child; QStringList actualOrder; - iface->navigate(QAccessible::Child, 1, &child); + child = iface->child(0); // first find the topmost button QAccessibleInterface *other; while (child->navigate(QAccessible::Up, 1, &other) != -1) { @@ -2597,10 +2558,10 @@ void tst_QAccessibility::tableWidgetTest() QCOMPARE(client->role(0), QAccessible::Client); QCOMPARE(client->childCount(), 3); QAccessibleInterface *view = 0; - client->navigate(QAccessible::Child, 1, &view); + view = client->child(0); QCOMPARE(view->role(0), QAccessible::Table); QAccessibleInterface *ifRow; - view->navigate(QAccessible::Child, 2, &ifRow); + ifRow = view->child(1); QCOMPARE(ifRow->role(0), QAccessible::Row); QAccessibleInterface *item; int entry = ifRow->navigate(QAccessible::Child, 1, &item); @@ -2810,7 +2771,7 @@ void tst_QAccessibility::table2ListTest() QCOMPARE(iface->childCount(), 3); QAccessibleInterface *child1 = 0; - QCOMPARE(iface->navigate(QAccessible::Child, 1, &child1), 0); + child1 = iface->child(0); QVERIFY(child1); QCOMPARE(iface->indexOfChild(child1), 1); QCOMPARE(child1->text(QAccessible::Name, 0), QString("Oslo")); @@ -2818,14 +2779,14 @@ void tst_QAccessibility::table2ListTest() delete child1; QAccessibleInterface *child2 = 0; - QCOMPARE(iface->navigate(QAccessible::Child, 2, &child2), 0); + child2 = iface->child(1); QVERIFY(child2); QCOMPARE(iface->indexOfChild(child2), 2); QCOMPARE(child2->text(QAccessible::Name, 0), QString("Berlin")); delete child2; QAccessibleInterface *child3 = 0; - QCOMPARE(iface->navigate(QAccessible::Child, 3, &child3), 0); + child3 = iface->child(2); QVERIFY(child3); QCOMPARE(iface->indexOfChild(child3), 3); QCOMPARE(child3->text(QAccessible::Name, 0), QString("Brisbane")); @@ -2916,7 +2877,7 @@ void tst_QAccessibility::table2TreeTest() QCOMPARE(iface->childCount(), 6); QAccessibleInterface *header1 = 0; - QCOMPARE(iface->navigate(QAccessible::Child, 1, &header1), 0); + header1 = iface->child(0); QVERIFY(header1); QCOMPARE(iface->indexOfChild(header1), 1); QCOMPARE(header1->text(QAccessible::Name, 0), QString("Artist")); @@ -2924,7 +2885,7 @@ void tst_QAccessibility::table2TreeTest() delete header1; QAccessibleInterface *child1 = 0; - QCOMPARE(iface->navigate(QAccessible::Child, 3, &child1), 0); + child1 = iface->child(2); QVERIFY(child1); QCOMPARE(iface->indexOfChild(child1), 3); QCOMPARE(child1->text(QAccessible::Name, 0), QString("Spain")); @@ -2933,7 +2894,7 @@ void tst_QAccessibility::table2TreeTest() delete child1; QAccessibleInterface *child2 = 0; - QCOMPARE(iface->navigate(QAccessible::Child, 5, &child2), 0); + child2 = iface->child(4); QVERIFY(child2); QCOMPARE(iface->indexOfChild(child2), 5); QCOMPARE(child2->text(QAccessible::Name, 0), QString("Austria")); @@ -3027,15 +2988,13 @@ void tst_QAccessibility::table2TableTest() // header and 2 rows (the others are not expanded, thus not visible) QCOMPARE(iface->childCount(), 9+3+3+1); // cell+headers+topleft button - QAccessibleInterface *cornerButton = 0; - QCOMPARE(iface->navigate(QAccessible::Child, 1, &cornerButton), 0); + QAccessibleInterface *cornerButton = iface->child(0); QVERIFY(cornerButton); QCOMPARE(iface->indexOfChild(cornerButton), 1); QCOMPARE(cornerButton->role(0), QAccessible::Pane); delete cornerButton; - QAccessibleInterface *child1 = 0; - QCOMPARE(iface->navigate(QAccessible::Child, 3, &child1), 0); + QAccessibleInterface *child1 = iface->child(2); QVERIFY(child1); QCOMPARE(iface->indexOfChild(child1), 3); QCOMPARE(child1->text(QAccessible::Name, 0), QString("h2")); @@ -3043,8 +3002,7 @@ void tst_QAccessibility::table2TableTest() QVERIFY(!(child1->state(0) & QAccessible::Expanded)); delete child1; - QAccessibleInterface *child2 = 0; - QCOMPARE(iface->navigate(QAccessible::Child, 11, &child2), 0); + QAccessibleInterface *child2 = iface->child(10); QVERIFY(child2); QCOMPARE(iface->indexOfChild(child2), 11); QCOMPARE(child2->text(QAccessible::Name, 0), QString("1.1")); @@ -3053,8 +3011,7 @@ void tst_QAccessibility::table2TableTest() QCOMPARE(cell2Iface->columnIndex(), 1); delete child2; - QAccessibleInterface *child3 = 0; - QCOMPARE(iface->navigate(QAccessible::Child, 12, &child3), 0); + QAccessibleInterface *child3 = iface->child(11); QCOMPARE(iface->indexOfChild(child3), 12); QCOMPARE(child3->text(QAccessible::Name, 0), QString("1.2")); delete child3; @@ -3164,24 +3121,20 @@ void tst_QAccessibility::calendarWidgetTest() QVERIFY(navigationBar->isVisible()); // Navigate to the navigation bar via Child. - QAccessibleInterface *navigationBarInterface = 0; - QCOMPARE(interface->navigate(QAccessible::Child, 1, &navigationBarInterface), 0); + QAccessibleInterface *navigationBarInterface = interface->child(0); QVERIFY(navigationBarInterface); QCOMPARE(navigationBarInterface->object(), (QObject*)navigationBar); delete navigationBarInterface; navigationBarInterface = 0; // Navigate to the view via Child. - QAccessibleInterface *calendarViewInterface = 0; - QCOMPARE(interface->navigate(QAccessible::Child, 2, &calendarViewInterface), 0); + QAccessibleInterface *calendarViewInterface = interface->child(1); QVERIFY(calendarViewInterface); QCOMPARE(calendarViewInterface->object(), (QObject*)calendarView); delete calendarViewInterface; calendarViewInterface = 0; - QAccessibleInterface *doesNotExistsInterface = 0; - QCOMPARE(interface->navigate(QAccessible::Child, 3, &doesNotExistsInterface), -1); - QVERIFY(!doesNotExistsInterface); + QVERIFY(!interface->child(-1)); // Navigate from navigation bar -> view (Down). QCOMPARE(interface->navigate(QAccessible::Down, 1, &calendarViewInterface), 0); @@ -3236,7 +3189,7 @@ void tst_QAccessibility::dockWidgetTest() QAccessibleInterface *accDock1 = 0; for (int i = 1; i <= 4; ++i) { if (accMainWindow->role(i) == QAccessible::Window) { - accMainWindow->navigate(QAccessible::Child, i, &accDock1); + accDock1 = accMainWindow->child(i-1); if (accDock1 && qobject_cast(accDock1->object()) == dock1) { break; } else { @@ -3253,15 +3206,15 @@ void tst_QAccessibility::dockWidgetTest() globalPos.rx()+=5; //### query style globalPos.ry()+=5; int entry = accDock1->childAt(globalPos.x(), globalPos.y()); //### - QAccessibleInterface *accTitleBar; - entry = accDock1->navigate(QAccessible::Child, entry, &accTitleBar); + QCOMPARE(entry, 1); + QAccessibleInterface *accTitleBar = accDock1->child(entry - 1); + QCOMPARE(accTitleBar->role(0), QAccessible::TitleBar); QCOMPARE(accDock1->indexOfChild(accTitleBar), 1); QAccessibleInterface *acc; - entry = accTitleBar->navigate(QAccessible::Ancestor, 1, &acc); + acc = accTitleBar->parent(); QVERIFY(acc); - QCOMPARE(entry, 0); - QCOMPARE(acc->role(0), QAccessible::Window); + QCOMPARE(acc->role(), QAccessible::Window); delete accTitleBar; -- cgit v1.2.3