diff options
author | Frederik Gladhorn <frederik.gladhorn@digia.com> | 2014-07-07 10:46:58 +0200 |
---|---|---|
committer | Frederik Gladhorn <frederik.gladhorn@digia.com> | 2014-07-26 22:20:02 +0200 |
commit | 0d98bba0cf5856b8a04eceebb3fae877f9c1045f (patch) | |
tree | 367d59ee6104ed89ed6fe214d2980b07fdf4ad07 /src/webengine | |
parent | b8dee3b91412289470ed6bd62d5d3a3b27157f92 (diff) |
Qt Quick based accessibility glue code
With this patch the accessibility hierarchy inside webengine becomes
accessible when navigating from Qt Quick based web views.
Change-Id: Ic1c8caaa908bd32e4175ee9dcdb7a6bef89818b6
Reviewed-by: Andras Becsi <andras.becsi@digia.com>
Diffstat (limited to 'src/webengine')
-rw-r--r-- | src/webengine/api/qquickwebengineview.cpp | 59 | ||||
-rw-r--r-- | src/webengine/api/qquickwebengineview_p.h | 1 | ||||
-rw-r--r-- | src/webengine/api/qquickwebengineview_p_p.h | 17 |
3 files changed, 77 insertions, 0 deletions
diff --git a/src/webengine/api/qquickwebengineview.cpp b/src/webengine/api/qquickwebengineview.cpp index 897a592eb..b71dbfd06 100644 --- a/src/webengine/api/qquickwebengineview.cpp +++ b/src/webengine/api/qquickwebengineview.cpp @@ -62,10 +62,18 @@ #include <QUrl> #include <private/qqmlmetatype_p.h> #include <private/qguiapplication_p.h> +#include <private/qquickaccessibleattached_p.h> #include <qpa/qplatformintegration.h> QT_BEGIN_NAMESPACE +static QAccessibleInterface *webAccessibleFactory(const QString &, QObject *object) +{ + if (QQuickWebEngineView *v = qobject_cast<QQuickWebEngineView*>(object)) + return new QQuickWebEngineViewAccessible(v); + return 0; +} + QQuickWebEngineViewPrivate::QQuickWebEngineViewPrivate() : adapter(new WebContentsAdapter) , e(new QQuickWebEngineViewExperimental(this)) @@ -94,6 +102,7 @@ QQuickWebEngineViewPrivate::QQuickWebEngineViewPrivate() // 1x, 2x, 3x etc assets that fit an integral number of pixels. setDevicePixelRatio(qMax(1, qRound(webPixelRatio))); } + QAccessible::installFactory(&webAccessibleFactory); } QQuickWebEngineViewPrivate::~QQuickWebEngineViewPrivate() @@ -376,6 +385,53 @@ void QQuickWebEngineViewPrivate::setDevicePixelRatio(qreal devicePixelRatio) m_dpiScale = devicePixelRatio / screen->devicePixelRatio(); } +QQuickWebEngineViewAccessible::QQuickWebEngineViewAccessible(QQuickWebEngineView *o) + : QAccessibleObject(o) +{} + +QAccessibleInterface *QQuickWebEngineViewAccessible::parent() const +{ + QQuickItem *parent = engineView()->parentItem(); + return QAccessible::queryAccessibleInterface(parent); +} + +int QQuickWebEngineViewAccessible::childCount() const +{ + if (engineView() && child(0)) + return 1; + return 0; +} + +QAccessibleInterface *QQuickWebEngineViewAccessible::child(int index) const +{ + if (index == 0) + return engineView()->d_func()->adapter->browserAccessible(); + return 0; +} + +int QQuickWebEngineViewAccessible::indexOfChild(const QAccessibleInterface *c) const +{ + if (c == child(0)) + return 0; + return -1; +} + +QString QQuickWebEngineViewAccessible::text(QAccessible::Text) const +{ + return QString(); +} + +QAccessible::Role QQuickWebEngineViewAccessible::role() const +{ + return QAccessible::Document; +} + +QAccessible::State QQuickWebEngineViewAccessible::state() const +{ + QAccessible::State s; + return s; +} + void QQuickWebEngineViewPrivate::adoptWebContents(WebContentsAdapter *webContents) { if (!webContents) { @@ -411,6 +467,9 @@ QQuickWebEngineView::QQuickWebEngineView(QQuickItem *parent) this->setFocus(true); this->setActiveFocusOnTab(true); this->setFlag(QQuickItem::ItemIsFocusScope); + + QQuickAccessibleAttached *accessible = QQuickAccessibleAttached::qmlAttachedProperties(this); + accessible->setRole(QAccessible::Grouping); } QQuickWebEngineView::~QQuickWebEngineView() diff --git a/src/webengine/api/qquickwebengineview_p.h b/src/webengine/api/qquickwebengineview_p.h index 78499081c..fd783eb84 100644 --- a/src/webengine/api/qquickwebengineview_p.h +++ b/src/webengine/api/qquickwebengineview_p.h @@ -133,6 +133,7 @@ private: friend class QQuickWebEngineViewExperimental; friend class QQuickWebEngineViewExperimentalExtension; friend class QQuickWebEngineNewViewRequest; + friend class QQuickWebEngineViewAccessible; }; QT_END_NAMESPACE diff --git a/src/webengine/api/qquickwebengineview_p_p.h b/src/webengine/api/qquickwebengineview_p_p.h index 3bae23cea..299d7b0a5 100644 --- a/src/webengine/api/qquickwebengineview_p_p.h +++ b/src/webengine/api/qquickwebengineview_p_p.h @@ -50,6 +50,7 @@ #include <QString> #include <QtCore/qcompilerdetection.h> #include <QtQuick/private/qquickitem_p.h> +#include <QtGui/qaccessibleobject.h> class WebContentsAdapter; class UIDelegatesManager; @@ -189,6 +190,22 @@ private: qreal m_dpiScale; }; +class QQuickWebEngineViewAccessible : public QAccessibleObject +{ +public: + QQuickWebEngineViewAccessible(QQuickWebEngineView *o); + QAccessibleInterface *parent() const Q_DECL_OVERRIDE; + int childCount() const Q_DECL_OVERRIDE; + QAccessibleInterface *child(int index) const Q_DECL_OVERRIDE; + int indexOfChild(const QAccessibleInterface*) const Q_DECL_OVERRIDE; + QString text(QAccessible::Text) const Q_DECL_OVERRIDE; + QAccessible::Role role() const Q_DECL_OVERRIDE; + QAccessible::State state() const Q_DECL_OVERRIDE; + +private: + QQuickWebEngineView *engineView() const { return static_cast<QQuickWebEngineView*>(object()); } +}; + QT_END_NAMESPACE QML_DECLARE_TYPE(QQuickWebEngineViewExperimental) |