summaryrefslogtreecommitdiffstats
path: root/src/core/browser_accessibility_qt.cpp
diff options
context:
space:
mode:
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