summaryrefslogtreecommitdiffstats
path: root/src/core/browser_accessibility_qt.cpp
diff options
context:
space:
mode:
authorFrederik Gladhorn <frederik.gladhorn@digia.com>2014-07-07 10:28:48 +0200
committerFrederik Gladhorn <frederik.gladhorn@digia.com>2014-07-09 15:09:44 +0200
commita9853701193c81c65f80a606943864cd9b1f4431 (patch)
tree401b380f8636830f8dedbcf40f23a156285fa156 /src/core/browser_accessibility_qt.cpp
parentbef6cc644f176a69a85c68126bd0d7e50ab5757e (diff)
Add core accessibility
This commit adds the basics to bridge the blink accessibility classes to QAccessibleInterfaces. Note that it needs two follow up commits to implement the bridging from the QWidget/Qt Quick worlds. [ChangeLog][Accessibility] QtWebEngine now has accessibility support, enabling assistive technology such as screen readers to work with it. Change-Id: Ied1d97e61a024115ac7a9245331211f6d9fac1b4 Reviewed-by: Zeno Albisser <zeno.albisser@digia.com> Reviewed-by: Andras Becsi <andras.becsi@digia.com>
Diffstat (limited to 'src/core/browser_accessibility_qt.cpp')
-rw-r--r--src/core/browser_accessibility_qt.cpp393
1 files changed, 393 insertions, 0 deletions
diff --git a/src/core/browser_accessibility_qt.cpp b/src/core/browser_accessibility_qt.cpp
new file mode 100644
index 000000000..bfbb3f69b
--- /dev/null
+++ b/src/core/browser_accessibility_qt.cpp
@@ -0,0 +1,393 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the QtWebEngine module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "browser_accessibility_qt.h"
+
+#include "content/common/accessibility_node_data.h"
+#include "third_party/WebKit/public/web/WebAXEnums.h"
+#include "type_conversion.h"
+#include "browser_accessibility_manager_qt.h"
+
+using namespace blink;
+
+namespace content {
+
+BrowserAccessibilityQt::BrowserAccessibilityQt()
+{
+ QAccessible::registerAccessibleInterface(this);
+}
+
+bool BrowserAccessibilityQt::isValid() const
+{
+ return true;
+}
+
+QObject *BrowserAccessibilityQt::object() const
+{
+ return 0;
+}
+
+QAccessibleInterface *BrowserAccessibilityQt::childAt(int x, int y) const
+{
+ return 0;
+}
+
+QAccessibleInterface *BrowserAccessibilityQt::parent() const
+{
+ BrowserAccessibility *p = BrowserAccessibility::parent();
+ if (p)
+ return static_cast<BrowserAccessibilityQt*>(p);
+ return static_cast<BrowserAccessibilityManagerQt*>(manager())->rootParentAccessible();
+}
+
+QAccessibleInterface *BrowserAccessibilityQt::child(int index) const
+{
+ return static_cast<BrowserAccessibilityQt*>(BrowserAccessibility::PlatformGetChild(index));
+}
+
+int BrowserAccessibilityQt::childCount() const
+{
+ return child_count();
+}
+
+int BrowserAccessibilityQt::indexOfChild(const QAccessibleInterface *iface) const
+{
+
+ const BrowserAccessibilityQt *child = static_cast<const BrowserAccessibilityQt*>(iface);
+ return child->index_in_parent();
+}
+
+QString BrowserAccessibilityQt::text(QAccessible::Text t) const
+{
+ std::string name_str = name();
+ return toQt(name_str);
+}
+
+void BrowserAccessibilityQt::setText(QAccessible::Text t, const QString &text)
+{
+}
+
+QRect BrowserAccessibilityQt::rect() const
+{
+ gfx::Rect bounds = GetGlobalBoundsRect();
+ return QRect(bounds.x(), bounds.y(), bounds.width(), bounds.height());
+}
+
+QAccessible::Role BrowserAccessibilityQt::role() const
+{
+ switch (BrowserAccessibility::role()) {
+ case WebAXRoleUnknown:
+ return QAccessible::NoRole;
+
+ // Used by Chromium to distinguish between the root of the tree
+ // for this page, and a web area for a frame within this page.
+ case WebAXRoleWebArea:
+ case WebAXRoleRootWebArea: // not sure if we need to make a diff here, but this seems common
+ return QAccessible::Document;
+
+ // These roles all directly correspond to blink accessibility roles,
+ // keep these alphabetical.
+ case WebAXRoleAlert:
+ return QAccessible::AlertMessage;
+ case WebAXRoleAnnotation:
+ return QAccessible::NoRole; // FIXME
+ case WebAXRoleApplication:
+ return QAccessible::Application;
+ case WebAXRoleArticle:
+ return QAccessible::Document; // FIXME
+ case WebAXRoleBrowser:
+ return QAccessible::Document; // FIXME
+ case WebAXRoleBusyIndicator:
+ return QAccessible::Animation; // FIXME
+ case WebAXRoleButton:
+ return QAccessible::Button;
+ case WebAXRoleCanvas:
+ return QAccessible::Canvas;
+ case WebAXRoleCell:
+ return QAccessible::Cell;
+ case WebAXRoleCheckBox:
+ return QAccessible::CheckBox;
+ case WebAXRoleColorWell:
+ return QAccessible::NoRole; // FIXME
+ case WebAXRoleColumn:
+ return QAccessible::Column;
+ case WebAXRoleColumnHeader:
+ return QAccessible::ColumnHeader;
+ case WebAXRoleComboBox:
+ return QAccessible::ComboBox;
+ case WebAXRoleDefinition:
+ return QAccessible::NoRole; // FIXME
+ case WebAXRoleDescriptionListDetail:
+ return QAccessible::NoRole; // FIXME
+ case WebAXRoleDescriptionListTerm:
+ return QAccessible::NoRole; // FIXME
+ case WebAXRoleDialog:
+ return QAccessible::Dialog;
+ case WebAXRoleDirectory:
+ return QAccessible::NoRole; // FIXME
+ case WebAXRoleDisclosureTriangle:
+ return QAccessible::NoRole; // FIXME
+ case WebAXRoleDiv:
+ return QAccessible::NoRole; // FIXME
+ case WebAXRoleDocument:
+ return QAccessible::Document;
+ case WebAXRoleDrawer:
+ return QAccessible::NoRole; // FIXME
+ case WebAXRoleEditableText:
+ return QAccessible::EditableText;
+ case WebAXRoleFooter:
+ return QAccessible::NoRole; // FIXME
+ case WebAXRoleForm:
+ return QAccessible::NoRole; // FIXME
+ case WebAXRoleGrid:
+ return QAccessible::NoRole; // FIXME
+ case WebAXRoleGroup:
+ return QAccessible::Grouping;
+ case WebAXRoleGrowArea:
+ return QAccessible::NoRole; // FIXME
+ case WebAXRoleHeading:
+ return QAccessible::StaticText; // FIXME
+ case WebAXRoleHelpTag:
+ return QAccessible::NoRole; // FIXME
+ case WebAXRoleHorizontalRule:
+ return QAccessible::NoRole; // FIXME
+ case WebAXRoleIgnored:
+ return QAccessible::NoRole;
+ case WebAXRoleImage:
+ return QAccessible::Graphic;
+ case WebAXRoleImageMap:
+ return QAccessible::NoRole; // FIXME
+ case WebAXRoleImageMapLink:
+ return QAccessible::NoRole; // FIXME
+ case WebAXRoleIncrementor:
+ return QAccessible::NoRole; // FIXME
+ case WebAXRoleLabel:
+ return QAccessible::StaticText;
+ case WebAXRoleLink:
+ return QAccessible::Link;
+ case WebAXRoleList:
+ return QAccessible::List;
+ case WebAXRoleListBox:
+ return QAccessible::NoRole; // FIXME
+ case WebAXRoleListBoxOption:
+ return QAccessible::NoRole; // FIXME
+ case WebAXRoleListItem:
+ return QAccessible::ListItem;
+ case WebAXRoleListMarker:
+ return QAccessible::NoRole; // FIXME
+ case WebAXRoleLog:
+ return QAccessible::NoRole; // FIXME
+ case WebAXRoleMarquee:
+ return QAccessible::NoRole; // FIXME
+ case WebAXRoleMath:
+ return QAccessible::NoRole; // FIXME
+ case WebAXRoleMatte:
+ return QAccessible::NoRole; // FIXME
+ case WebAXRoleMenu:
+ return QAccessible::PopupMenu;
+ case WebAXRoleMenuBar:
+ return QAccessible::MenuBar;
+ case WebAXRoleMenuItem:
+ return QAccessible::MenuItem;
+ case WebAXRoleMenuButton:
+ return QAccessible::MenuItem;
+ case WebAXRoleMenuListOption:
+ return QAccessible::NoRole; // FIXME
+ case WebAXRoleMenuListPopup:
+ return QAccessible::PopupMenu;
+ case WebAXRoleNote:
+ return QAccessible::NoRole; // FIXME
+ case WebAXRoleOutline:
+ return QAccessible::NoRole; // FIXME
+ case WebAXRoleParagraph:
+ return QAccessible::NoRole; // FIXME
+ case WebAXRolePopUpButton:
+ return QAccessible::NoRole; // FIXME
+ case WebAXRolePresentational:
+ return QAccessible::NoRole; // FIXME
+ case WebAXRoleProgressIndicator:
+ return QAccessible::NoRole; // FIXME
+ case WebAXRoleRadioButton:
+ return QAccessible::RadioButton;
+ case WebAXRoleRadioGroup:
+ return QAccessible::RadioButton;
+ case WebAXRoleRegion:
+ return QAccessible::NoRole; // FIXME
+ case WebAXRoleRow:
+ return QAccessible::Row;
+ case WebAXRoleRowHeader:
+ return QAccessible::RowHeader;
+ case WebAXRoleRuler:
+ return QAccessible::NoRole; // FIXME
+ case WebAXRoleRulerMarker:
+ return QAccessible::NoRole; // FIXME
+ case WebAXRoleScrollArea:
+ return QAccessible::NoRole; // FIXME
+ case WebAXRoleScrollBar:
+ return QAccessible::ScrollBar;
+ case WebAXRoleSheet:
+ return QAccessible::NoRole; // FIXME
+ case WebAXRoleSlider:
+ return QAccessible::Slider;
+ case WebAXRoleSliderThumb:
+ return QAccessible::NoRole; // FIXME
+ case WebAXRoleSpinButton:
+ return QAccessible::NoRole; // FIXME
+ case WebAXRoleSpinButtonPart:
+ return QAccessible::NoRole; // FIXME
+ case WebAXRoleSplitter:
+ return QAccessible::Splitter;
+ case WebAXRoleSplitGroup:
+ return QAccessible::NoRole; // FIXME
+ case WebAXRoleStaticText:
+ return QAccessible::StaticText;
+ case WebAXRoleStatus:
+ return QAccessible::NoRole; // FIXME
+ case WebAXRoleSVGRoot:
+ return QAccessible::NoRole; // FIXME
+ case WebAXRoleSystemWide:
+ return QAccessible::NoRole; // FIXME
+ case WebAXRoleTab:
+ return QAccessible::PageTab;
+ case WebAXRoleTable:
+ return QAccessible::Table;
+ case WebAXRoleTableHeaderContainer:
+ return QAccessible::NoRole; // FIXME
+ case WebAXRoleTabGroup: // blink doesn't use (uses ROLE_TAB_LIST)
+ return QAccessible::NoRole; // FIXME
+ case WebAXRoleTabList:
+ return QAccessible::PageTabList;
+ case WebAXRoleTabPanel:
+ return QAccessible::PageTab;
+ case WebAXRoleTextArea:
+ return QAccessible::EditableText;
+ case WebAXRoleTextField:
+ return QAccessible::EditableText;
+ case WebAXRoleTimer:
+ return QAccessible::NoRole; // FIXME
+ case WebAXRoleToggleButton:
+ return QAccessible::Button; // FIXME
+ case WebAXRoleToolbar:
+ return QAccessible::ToolBar;
+ case WebAXRoleUserInterfaceTooltip:
+ return QAccessible::ToolTip;
+ case WebAXRoleTree:
+ return QAccessible::Tree;
+ case WebAXRoleTreeGrid:
+ return QAccessible::NoRole; // FIXME
+ case WebAXRoleTreeItem:
+ return QAccessible::TreeItem;
+ case WebAXRoleValueIndicator:
+ return QAccessible::NoRole; // FIXME
+ case WebAXRoleWindow:
+ return QAccessible::Window;
+ }
+ return QAccessible::NoRole;
+}
+
+QAccessible::State BrowserAccessibilityQt::state() const
+{
+ QAccessible::State state = QAccessible::State();
+ int32 s = BrowserAccessibility::state();
+ if (s & (1 << WebAXStateBusy))
+ state.busy = true;
+ if (s & (1 << WebAXStateChecked))
+ state.checked = true;
+ if (s & (1 << WebAXStateCollapsed))
+ state.collapsed = true;
+ if (!(s & (1 << WebAXStateEnabled)))
+ state.disabled = true;
+ if (s & (1 << WebAXStateExpanded))
+ state.expanded = true;
+ if (s & (1 << WebAXStateFocusable))
+ state.focusable = true;
+ if (s & (1 << WebAXStateFocused))
+ state.focused = true;
+ if (s & (1 << WebAXStateHaspopup))
+ state.hasPopup = true;
+ if (s & (1 << WebAXStateHovered))
+ state.hotTracked = true;
+ if (s & (1 << WebAXStateIndeterminate))
+ {} // FIXME
+ if (s & (1 << WebAXStateInvisible))
+ state.invisible = true;
+ if (s & (1 << WebAXStateLinked))
+ state.linked = true;
+ if (s & (1 << WebAXStateMultiselectable))
+ state.multiSelectable = true;
+ if (s & (1 << WebAXStateOffscreen))
+ state.offscreen = true;
+ if (s & (1 << WebAXStatePressed))
+ state.pressed = true;
+ if (s & (1 << WebAXStateProtected))
+ {} // FIXME
+ if (s & (1 << WebAXStateReadonly))
+ state.readOnly = true;
+ if (s & (1 << WebAXStateRequired))
+ {} // FIXME
+ if (s & (1 << WebAXStateSelectable))
+ state.selectable = true;
+ if (s & (1 << WebAXStateSelected))
+ state.selected = true;
+ if (s & (1 << WebAXStateVertical))
+ {} // FIXME
+ if (s & (1 << WebAXStateVisited))
+ {} // FIXME
+ return state;
+}
+
+// Qt does not reference count accessibles
+void BrowserAccessibilityQt::NativeAddReference()
+{
+}
+
+// there is no reference counting, but BrowserAccessibility::Destroy
+// calls this (and that is the only place in the chromium sources,
+// so we can safely use it to dispose of ourselves here
+// (the default implementation of this function just contains a "delete this")
+void BrowserAccessibilityQt::NativeReleaseReference()
+{
+ // delete this
+ QAccessible::Id interfaceId = QAccessible::uniqueId(this);
+ QAccessible::deleteAccessibleInterface(interfaceId);
+}
+
+} // namespace content