diff options
Diffstat (limited to 'src/core/browser_accessibility_qt.cpp')
-rw-r--r-- | src/core/browser_accessibility_qt.cpp | 393 |
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 |