aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/templates/qquickcontrol.cpp13
-rw-r--r--src/templates/qquickmenu.cpp7
-rw-r--r--src/templates/qquickmenu_p.h5
-rw-r--r--src/templates/qquickpopup.cpp15
-rw-r--r--src/templates/qquickpopup_p.h8
-rw-r--r--src/templates/qquickpopup_p_p.h4
-rw-r--r--tests/auto/accessibility/accessibility.pro2
-rw-r--r--tests/auto/accessibility/data/menu.qml12
-rw-r--r--tests/auto/accessibility/data/popup.qml12
-rw-r--r--tests/auto/accessibility/tst_accessibility.cpp20
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);