summaryrefslogtreecommitdiffstats
path: root/src/webengine
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 /src/webengine
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>
Diffstat (limited to 'src/webengine')
-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)