diff options
-rw-r--r-- | src/templates/qquickcontrol.cpp | 13 | ||||
-rw-r--r-- | src/templates/qquickmenu.cpp | 7 | ||||
-rw-r--r-- | src/templates/qquickmenu_p.h | 5 | ||||
-rw-r--r-- | src/templates/qquickpopup.cpp | 15 | ||||
-rw-r--r-- | src/templates/qquickpopup_p.h | 8 | ||||
-rw-r--r-- | src/templates/qquickpopup_p_p.h | 4 | ||||
-rw-r--r-- | tests/auto/accessibility/accessibility.pro | 2 | ||||
-rw-r--r-- | tests/auto/accessibility/data/menu.qml | 12 | ||||
-rw-r--r-- | tests/auto/accessibility/data/popup.qml | 12 | ||||
-rw-r--r-- | tests/auto/accessibility/tst_accessibility.cpp | 20 |
10 files changed, 91 insertions, 7 deletions
diff --git a/src/templates/qquickcontrol.cpp b/src/templates/qquickcontrol.cpp index 5636d84f..0e14bc37 100644 --- a/src/templates/qquickcontrol.cpp +++ b/src/templates/qquickcontrol.cpp @@ -199,10 +199,15 @@ void QQuickControl::accessibilityActiveChanged(bool active) return; d->accessibleAttached = qobject_cast<QQuickAccessibleAttached *>(qmlAttachedPropertiesObject<QQuickAccessibleAttached>(this, true)); - if (d->accessibleAttached) - d->accessibleAttached->setRole(accessibleRole()); - else - qWarning() << "QQuickControl: " << this << " QQuickAccessibleAttached object creation failed!"; + + // QQuickControl relies on the existence of a QQuickAccessibleAttached object. + // However, qmlAttachedPropertiesObject(create=true) creates an instance only + // for items that have been created by a QML engine. Therefore we create the + // object by hand for items created in C++ (QQuickPopupItem, for instance). + if (!d->accessibleAttached) + d->accessibleAttached = new QQuickAccessibleAttached(this); + + d->accessibleAttached->setRole(accessibleRole()); } #endif diff --git a/src/templates/qquickmenu.cpp b/src/templates/qquickmenu.cpp index b61985d5..0ea0caba 100644 --- a/src/templates/qquickmenu.cpp +++ b/src/templates/qquickmenu.cpp @@ -518,6 +518,13 @@ bool QQuickMenu::eventFilter(QObject *object, QEvent *event) return QQuickPopup::eventFilter(object, event); } +#ifndef QT_NO_ACCESSIBILITY +QAccessible::Role QQuickMenu::accessibleRole() const +{ + return QAccessible::PopupMenu; +} +#endif // QT_NO_ACCESSIBILITY + QT_END_NAMESPACE #include "moc_qquickmenu_p.cpp" diff --git a/src/templates/qquickmenu_p.h b/src/templates/qquickmenu_p.h index 065ee1d7..b70ca49f 100644 --- a/src/templates/qquickmenu_p.h +++ b/src/templates/qquickmenu_p.h @@ -89,6 +89,11 @@ protected: Q_SIGNALS: void titleChanged(); +protected: +#ifndef QT_NO_ACCESSIBILITY + QAccessible::Role accessibleRole() const Q_DECL_OVERRIDE; +#endif // QT_NO_ACCESSIBILITY + private: Q_DISABLE_COPY(QQuickMenu) Q_DECLARE_PRIVATE(QQuickMenu) diff --git a/src/templates/qquickpopup.cpp b/src/templates/qquickpopup.cpp index 0a9d9499..7ac0369f 100644 --- a/src/templates/qquickpopup.cpp +++ b/src/templates/qquickpopup.cpp @@ -367,6 +367,14 @@ void QQuickPopupItem::paddingChange(const QMarginsF &newPadding, const QMarginsF d->popup->paddingChange(newPadding, oldPadding); } +#ifndef QT_NO_ACCESSIBILITY +QAccessible::Role QQuickPopupItem::accessibleRole() const +{ + Q_D(const QQuickPopupItem); + return d->popup->accessibleRole(); +} +#endif // QT_NO_ACCESSIBILITY + QQuickPopupPositioner::QQuickPopupPositioner(QQuickPopupPrivate *popup) : m_x(0), m_y(0), @@ -1648,6 +1656,13 @@ void QQuickPopup::paddingChange(const QMarginsF &newPadding, const QMarginsF &ol emit availableHeightChanged(); } +#ifndef QT_NO_ACCESSIBILITY +QAccessible::Role QQuickPopup::accessibleRole() const +{ + return QAccessible::LayeredPane; +} +#endif // QT_NO_ACCESSIBILITY + QT_END_NAMESPACE #include "moc_qquickpopup_p.cpp" diff --git a/src/templates/qquickpopup_p.h b/src/templates/qquickpopup_p.h index eb52882c..b818ea7f 100644 --- a/src/templates/qquickpopup_p.h +++ b/src/templates/qquickpopup_p.h @@ -56,6 +56,10 @@ #include <QtQml/qqmllist.h> #include <QtQml/qqmlparserstatus.h> +#ifndef QT_NO_ACCESSIBILITY +#include <QtGui/qaccessible.h> +#endif + QT_BEGIN_NAMESPACE class QQuickItem; @@ -317,6 +321,10 @@ protected: virtual void marginsChange(const QMarginsF &newMargins, const QMarginsF &oldMargins); virtual void paddingChange(const QMarginsF &newPadding, const QMarginsF &oldPadding); +#ifndef QT_NO_ACCESSIBILITY + virtual QAccessible::Role accessibleRole() const; +#endif + private: Q_DISABLE_COPY(QQuickPopup) Q_DECLARE_PRIVATE(QQuickPopup) diff --git a/src/templates/qquickpopup_p_p.h b/src/templates/qquickpopup_p_p.h index 45dd7fd9..017949cd 100644 --- a/src/templates/qquickpopup_p_p.h +++ b/src/templates/qquickpopup_p_p.h @@ -108,6 +108,10 @@ protected: void itemChange(ItemChange change, const ItemChangeData &data) Q_DECL_OVERRIDE; void paddingChange(const QMarginsF &newPadding, const QMarginsF &oldPadding) Q_DECL_OVERRIDE; +#ifndef QT_NO_ACCESSIBILITY + QAccessible::Role accessibleRole() const Q_DECL_OVERRIDE; +#endif + private: Q_DECLARE_PRIVATE(QQuickPopupItem) }; diff --git a/tests/auto/accessibility/accessibility.pro b/tests/auto/accessibility/accessibility.pro index c57eba11..ca751265 100644 --- a/tests/auto/accessibility/accessibility.pro +++ b/tests/auto/accessibility/accessibility.pro @@ -4,7 +4,7 @@ SOURCES += tst_accessibility.cpp osx:CONFIG -= app_bundle -QT += core-private gui-private qml-private quick-private testlib +QT += core-private gui-private qml-private quick-private labstemplates-private testlib include (../shared/util.pri) diff --git a/tests/auto/accessibility/data/menu.qml b/tests/auto/accessibility/data/menu.qml new file mode 100644 index 00000000..8903bd0b --- /dev/null +++ b/tests/auto/accessibility/data/menu.qml @@ -0,0 +1,12 @@ +import QtQuick 2.5 +import QtQuick.Window 2.2 +import Qt.labs.controls 1.0 + +Window { + visible: true + + Menu { + id: menu + objectName: "menu" + } +} diff --git a/tests/auto/accessibility/data/popup.qml b/tests/auto/accessibility/data/popup.qml new file mode 100644 index 00000000..e95ef2b7 --- /dev/null +++ b/tests/auto/accessibility/data/popup.qml @@ -0,0 +1,12 @@ +import QtQuick 2.5 +import QtQuick.Window 2.2 +import Qt.labs.controls 1.0 + +Window { + visible: true + + Popup { + id: popup + objectName: "popup" + } +} diff --git a/tests/auto/accessibility/tst_accessibility.cpp b/tests/auto/accessibility/tst_accessibility.cpp index 16a138b5..8c05e2f2 100644 --- a/tests/auto/accessibility/tst_accessibility.cpp +++ b/tests/auto/accessibility/tst_accessibility.cpp @@ -41,6 +41,7 @@ #include <QtQml/qqmlcontext.h> #include <QtQuick/qquickview.h> #include <QtQuick/private/qquickitem_p.h> +#include <QtLabsTemplates/private/qquickpopup_p.h> #include "../shared/util.h" #include "../shared/visualtestutil.h" @@ -75,7 +76,9 @@ void tst_accessibility::a11y_data() // Frame // GroupBox QTest::newRow("Label") << "label" << 0x00000029 << "Label"; //QAccessible::StaticText + QTest::newRow("Menu") << "menu" << 0x0000000B << ""; //QAccessible::PopupMenu QTest::newRow("PageIndicator") << "pageindicator" << 0x00000027 << ""; //QAccessible::Indicator + QTest::newRow("Popup") << "popup" << 0x00000080 << ""; //QAccessible::LayeredPane QTest::newRow("ProgressBar") << "progressbar" << 0x00000030 << ""; //QAccessible::ProgressBar QTest::newRow("RadioButton") << "radiobutton" << 0x0000002D << "RadioButton"; //QAccessible::RadioButton QTest::newRow("RangeSlider") << "rangeslider" << 0x00000033 << ""; //QAccessible::Slider @@ -102,6 +105,14 @@ void tst_accessibility::a11y_data() QTest::newRow("WeekNumberColumn") << "weeknumbercolumn" << 0x0 << "WeekNumberColumn"; //QAccessible::NoRole } +static QQuickAccessibleAttached *accessibleAttached(QQuickItem *item) +{ + QQuickAccessibleAttached *acc = qobject_cast<QQuickAccessibleAttached *>(qmlAttachedPropertiesObject<QQuickAccessibleAttached>(item, false)); + if (!acc) + acc = item->findChild<QQuickAccessibleAttached *>(); + return acc; +} + void tst_accessibility::a11y() { QFETCH(QString, name); @@ -128,10 +139,15 @@ void tst_accessibility::a11y() QVERIFY(QTest::qWaitForWindowActive(window)); QQuickItem *item = findItem<QQuickItem>(window->contentItem(), name); + if (!item) { + QQuickPopup *popup = window->contentItem()->findChild<QQuickPopup *>(name); + if (popup) + item = popup->popupItem(); + } QVERIFY(item); #ifndef QT_NO_ACCESSIBILITY - QQuickAccessibleAttached *acc = qobject_cast<QQuickAccessibleAttached *>(qmlAttachedPropertiesObject<QQuickAccessibleAttached>(item, false)); + QQuickAccessibleAttached *acc = accessibleAttached(item); if (name != QLatin1Literal("dayofweekrow") && name != QLatin1Literal("monthgrid") && name != QLatin1Literal("weeknumbercolumn")) { @@ -140,7 +156,7 @@ void tst_accessibility::a11y() } else { QVERIFY(!acc); QAccessible::setActive(true); - acc = qobject_cast<QQuickAccessibleAttached *>(qmlAttachedPropertiesObject<QQuickAccessibleAttached>(item, false)); + acc = accessibleAttached(item); } } QVERIFY(acc); |