summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFrederik Gladhorn <frederik.gladhorn@digia.com>2014-07-07 10:46:58 +0200
committerFrederik Gladhorn <frederik.gladhorn@digia.com>2014-07-26 22:20:02 +0200
commit0d98bba0cf5856b8a04eceebb3fae877f9c1045f (patch)
tree367d59ee6104ed89ed6fe214d2980b07fdf4ad07
parentb8dee3b91412289470ed6bd62d5d3a3b27157f92 (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>
-rw-r--r--src/webengine/api/qquickwebengineview.cpp59
-rw-r--r--src/webengine/api/qquickwebengineview_p.h1
-rw-r--r--src/webengine/api/qquickwebengineview_p_p.h17
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)