summaryrefslogtreecommitdiff
path: root/Source/WebCore/accessibility/atk/WebKitAccessibleWrapperAtk.cpp
diff options
context:
space:
mode:
authorLorry Tar Creator <lorry-tar-importer@lorry>2016-04-10 09:28:39 +0000
committerLorry Tar Creator <lorry-tar-importer@lorry>2016-04-10 09:28:39 +0000
commit32761a6cee1d0dee366b885b7b9c777e67885688 (patch)
treed6bec92bebfb216f4126356e55518842c2f476a1 /Source/WebCore/accessibility/atk/WebKitAccessibleWrapperAtk.cpp
parenta4e969f4965059196ca948db781e52f7cfebf19e (diff)
downloadWebKitGtk-tarball-32761a6cee1d0dee366b885b7b9c777e67885688.tar.gz
webkitgtk-2.4.11webkitgtk-2.4.11
Diffstat (limited to 'Source/WebCore/accessibility/atk/WebKitAccessibleWrapperAtk.cpp')
-rw-r--r--Source/WebCore/accessibility/atk/WebKitAccessibleWrapperAtk.cpp459
1 files changed, 245 insertions, 214 deletions
diff --git a/Source/WebCore/accessibility/atk/WebKitAccessibleWrapperAtk.cpp b/Source/WebCore/accessibility/atk/WebKitAccessibleWrapperAtk.cpp
index a873067df..79eb46d35 100644
--- a/Source/WebCore/accessibility/atk/WebKitAccessibleWrapperAtk.cpp
+++ b/Source/WebCore/accessibility/atk/WebKitAccessibleWrapperAtk.cpp
@@ -37,7 +37,6 @@
#include "AXObjectCache.h"
#include "AccessibilityList.h"
#include "AccessibilityListBoxOption.h"
-#include "AccessibilityTable.h"
#include "Document.h"
#include "Frame.h"
#include "FrameView.h"
@@ -58,7 +57,6 @@
#include "WebKitAccessibleInterfaceImage.h"
#include "WebKitAccessibleInterfaceSelection.h"
#include "WebKitAccessibleInterfaceTable.h"
-#include "WebKitAccessibleInterfaceTableCell.h"
#include "WebKitAccessibleInterfaceText.h"
#include "WebKitAccessibleInterfaceValue.h"
#include "WebKitAccessibleUtil.h"
@@ -66,6 +64,10 @@
#include <glib/gprintf.h>
#include <wtf/text/CString.h>
+#if PLATFORM(GTK)
+#include <gtk/gtk.h>
+#endif
+
using namespace WebCore;
struct _WebKitAccessiblePrivate {
@@ -91,7 +93,7 @@ struct _WebKitAccessiblePrivate {
static AccessibilityObject* fallbackObject()
{
- static AccessibilityObject* object = &AccessibilityListBoxOption::create().leakRef();
+ static AccessibilityObject* object = AccessibilityListBoxOption::create().leakRef();
return object;
}
@@ -109,6 +111,10 @@ static const gchar* webkitAccessibleGetName(AtkObject* object)
returnValIfWebKitAccessibleIsInvalid(WEBKIT_ACCESSIBLE(object), 0);
AccessibilityObject* coreObject = core(object);
+
+ if (!coreObject->isAccessibilityRenderObject())
+ return cacheAndReturnAtkProperty(object, AtkCachedAccessibleName, coreObject->stringValue());
+
if (coreObject->isFieldset()) {
AccessibilityObject* label = coreObject->titleUIElement();
if (label) {
@@ -132,11 +138,11 @@ static const gchar* webkitAccessibleGetName(AtkObject* object)
return cacheAndReturnAtkProperty(object, AtkCachedAccessibleName, textUnder);
}
- if (coreObject->isImage() || coreObject->isInputImage() || coreObject->isImageMap() || coreObject->isImageMapLink()) {
+ if (coreObject->isImage() || coreObject->isInputImage()) {
Node* node = coreObject->node();
- if (is<HTMLElement>(node)) {
+ if (node && node->isHTMLElement()) {
// Get the attribute rather than altText String so as not to fall back on title.
- const AtomicString& alt = downcast<HTMLElement>(*node).getAttribute(HTMLNames::altAttr);
+ String alt = toHTMLElement(node)->getAttribute(HTMLNames::altAttr);
if (!alt.isEmpty())
return cacheAndReturnAtkProperty(object, AtkCachedAccessibleName, alt);
}
@@ -164,22 +170,22 @@ static const gchar* webkitAccessibleGetDescription(AtkObject* object)
returnValIfWebKitAccessibleIsInvalid(WEBKIT_ACCESSIBLE(object), 0);
AccessibilityObject* coreObject = core(object);
- Node* node = nullptr;
+ Node* node = 0;
if (coreObject->isAccessibilityRenderObject())
node = coreObject->node();
- if (!is<HTMLElement>(node) || coreObject->ariaRoleAttribute() != UnknownRole || coreObject->isImage())
+ if (!node || !node->isHTMLElement() || coreObject->ariaRoleAttribute() != UnknownRole || coreObject->isImage())
return cacheAndReturnAtkProperty(object, AtkCachedAccessibleDescription, accessibilityDescription(coreObject));
// atk_table_get_summary returns an AtkObject. We have no summary object, so expose summary here.
if (coreObject->roleValue() == TableRole) {
- const AtomicString& summary = downcast<HTMLTableElement>(*node).summary();
+ String summary = toHTMLTableElement(node)->summary();
if (!summary.isEmpty())
return cacheAndReturnAtkProperty(object, AtkCachedAccessibleDescription, summary);
}
// The title attribute should be reliably available as the object's descripton.
// We do not want to fall back on other attributes in its absence. See bug 25524.
- String title = downcast<HTMLElement>(*node).title();
+ String title = toHTMLElement(node)->title();
if (!title.isEmpty())
return cacheAndReturnAtkProperty(object, AtkCachedAccessibleDescription, title);
@@ -248,18 +254,9 @@ static void setAtkRelationSetFromCoreObject(AccessibilityObject* coreObject, Atk
for (const auto& accessibilityObject : ariaDescribedByElements)
atk_relation_set_add_relation_by_type(relationSet, ATK_RELATION_DESCRIBED_BY, accessibilityObject->wrapper());
}
-
- // Check whether object supports aria-controls. It provides information about elements that are controlled by the current object.
- if (coreObject->supportsARIAControls()) {
- removeAtkRelationByType(relationSet, ATK_RELATION_CONTROLLER_FOR);
- AccessibilityObject::AccessibilityChildrenVector ariaControls;
- coreObject->ariaControlsElements(ariaControls);
- for (const auto& accessibilityObject : ariaControls)
- atk_relation_set_add_relation_by_type(relationSet, ATK_RELATION_CONTROLLER_FOR, accessibilityObject->wrapper());
- }
}
-static gpointer webkitAccessibleParentClass = nullptr;
+static gpointer webkitAccessibleParentClass = 0;
static bool isRootObject(AccessibilityObject* coreObject)
{
@@ -287,6 +284,18 @@ static AtkObject* atkParentOfRootObject(AtkObject* object)
Document* document = coreObject->document();
if (!document)
return 0;
+
+#if PLATFORM(GTK)
+ HostWindow* hostWindow = document->view()->hostWindow();
+ if (hostWindow) {
+ PlatformPageClient scrollView = hostWindow->platformPageClient();
+ if (scrollView) {
+ GtkWidget* scrollViewParent = gtk_widget_get_parent(scrollView);
+ if (scrollViewParent)
+ return gtk_widget_get_accessible(scrollViewParent);
+ }
+ }
+#endif // PLATFORM(GTK)
}
if (!coreParent)
@@ -318,9 +327,31 @@ static AtkObject* webkitAccessibleGetParent(AtkObject* object)
if (!coreParent)
return 0;
+ // We don't expose table rows to Assistive technologies, but we
+ // need to have them anyway in the hierarchy from WebCore to
+ // properly perform coordinates calculations when requested.
+ if (coreParent->isTableRow() && coreObject->isTableCell())
+ coreParent = coreParent->parentObjectUnignored();
+
return coreParent->wrapper();
}
+static gint getNChildrenForTable(AccessibilityObject* coreObject)
+{
+ const AccessibilityObject::AccessibilityChildrenVector& tableChildren = coreObject->children();
+ size_t cellsCount = 0;
+
+ // Look for the actual index of the cell inside the table.
+ for (const auto& tableChild : tableChildren) {
+ if (tableChild->isTableRow())
+ cellsCount += tableChild->children().size();
+ else
+ cellsCount++;
+ }
+
+ return cellsCount;
+}
+
static gint webkitAccessibleGetNChildren(AtkObject* object)
{
g_return_val_if_fail(WEBKIT_IS_ACCESSIBLE(object), 0);
@@ -328,9 +359,38 @@ static gint webkitAccessibleGetNChildren(AtkObject* object)
AccessibilityObject* coreObject = core(object);
+ // Tables should be treated in a different way because rows should
+ // be bypassed when exposing the accessible hierarchy.
+ if (coreObject->isAccessibilityTable())
+ return getNChildrenForTable(coreObject);
+
return coreObject->children().size();
}
+static AccessibilityObject* getChildForTable(AccessibilityObject* coreObject, gint index)
+{
+ const AccessibilityObject::AccessibilityChildrenVector& tableChildren = coreObject->children();
+ size_t cellsCount = 0;
+
+ // Look for the actual index of the cell inside the table.
+ size_t current = static_cast<size_t>(index);
+ for (const auto& tableChild : tableChildren) {
+ if (tableChild->isTableRow()) {
+ const AccessibilityObject::AccessibilityChildrenVector& rowChildren = tableChild->children();
+ size_t rowChildrenCount = rowChildren.size();
+ if (current < cellsCount + rowChildrenCount)
+ return rowChildren.at(current - cellsCount).get();
+ cellsCount += rowChildrenCount;
+ } else if (cellsCount == current)
+ return tableChild.get();
+ else
+ cellsCount++;
+ }
+
+ // Shouldn't reach if the child was found.
+ return 0;
+}
+
static AtkObject* webkitAccessibleRefChild(AtkObject* object, gint index)
{
g_return_val_if_fail(WEBKIT_IS_ACCESSIBLE(object), 0);
@@ -340,12 +400,18 @@ static AtkObject* webkitAccessibleRefChild(AtkObject* object, gint index)
return 0;
AccessibilityObject* coreObject = core(object);
- AccessibilityObject* coreChild = nullptr;
-
- const AccessibilityObject::AccessibilityChildrenVector& children = coreObject->children();
- if (static_cast<size_t>(index) >= children.size())
- return 0;
- coreChild = children.at(index).get();
+ AccessibilityObject* coreChild = 0;
+
+ // Tables are special cases because rows should be bypassed, but
+ // still taking their cells into account.
+ if (coreObject->isAccessibilityTable())
+ coreChild = getChildForTable(coreObject, index);
+ else {
+ const AccessibilityObject::AccessibilityChildrenVector& children = coreObject->children();
+ if (static_cast<unsigned>(index) >= children.size())
+ return 0;
+ coreChild = children.at(index).get();
+ }
if (!coreChild)
return 0;
@@ -357,6 +423,40 @@ static AtkObject* webkitAccessibleRefChild(AtkObject* object, gint index)
return child;
}
+static gint getIndexInParentForCellInRow(AccessibilityObject* coreObject)
+{
+ AccessibilityObject* parent = coreObject->parentObjectUnignored();
+ if (!parent)
+ return -1;
+
+ AccessibilityObject* grandParent = parent->parentObjectUnignored();
+ if (!grandParent)
+ return -1;
+
+ const AccessibilityObject::AccessibilityChildrenVector& rows = grandParent->children();
+ size_t previousCellsCount = 0;
+
+ // Look for the actual index of the cell inside the table.
+ for (const auto& row : rows) {
+ if (!row->isTableRow())
+ continue;
+
+ const AccessibilityObject::AccessibilityChildrenVector& cells = row->children();
+ size_t cellsCount = cells.size();
+
+ if (row == parent) {
+ for (unsigned j = 0; j < cellsCount; ++j) {
+ if (cells[j] == coreObject)
+ return previousCellsCount + j;
+ }
+ }
+
+ previousCellsCount += cellsCount;
+ }
+
+ return -1;
+}
+
static gint webkitAccessibleGetIndexInParent(AtkObject* object)
{
g_return_val_if_fail(WEBKIT_IS_ACCESSIBLE(object), -1);
@@ -380,6 +480,11 @@ static gint webkitAccessibleGetIndexInParent(AtkObject* object)
}
}
+ // Need to calculate the index of the cell in the table, as
+ // rows won't be exposed to assistive technologies.
+ if (parent && parent->isTableRow() && coreObject->isTableCell())
+ return getIndexInParentForCellInRow(coreObject);
+
if (!parent)
return -1;
@@ -392,7 +497,7 @@ static AtkAttributeSet* webkitAccessibleGetAttributes(AtkObject* object)
g_return_val_if_fail(WEBKIT_IS_ACCESSIBLE(object), 0);
returnValIfWebKitAccessibleIsInvalid(WEBKIT_ACCESSIBLE(object), 0);
- AtkAttributeSet* attributeSet = nullptr;
+ AtkAttributeSet* attributeSet = 0;
#if PLATFORM(GTK)
attributeSet = addToAtkAttributeSet(attributeSet, "toolkit", "WebKitGtk");
#elif PLATFORM(EFL)
@@ -406,12 +511,9 @@ static AtkAttributeSet* webkitAccessibleGetAttributes(AtkObject* object)
// Hack needed for WebKit2 tests because obtaining an element by its ID
// cannot be done from the UIProcess. Assistive technologies have no need
// for this information.
- Element* element = coreObject->element() ? coreObject->element() : coreObject->actionElement();
- if (element) {
- String tagName = element->tagName();
- if (!tagName.isEmpty())
- attributeSet = addToAtkAttributeSet(attributeSet, "tag", tagName.convertToASCIILowercase().utf8().data());
- String id = element->getIdAttribute().string();
+ Node* node = coreObject->node();
+ if (node && node->isElementNode()) {
+ String id = toElement(node)->getIdAttribute().string();
if (!id.isEmpty())
attributeSet = addToAtkAttributeSet(attributeSet, "html-id", id.utf8().data());
}
@@ -422,16 +524,9 @@ static AtkAttributeSet* webkitAccessibleGetAttributes(AtkObject* object)
attributeSet = addToAtkAttributeSet(attributeSet, "level", value.utf8().data());
}
- if (coreObject->roleValue() == MathElementRole) {
- if (coreObject->isMathMultiscriptObject(PreSuperscript) || coreObject->isMathMultiscriptObject(PreSubscript))
- attributeSet = addToAtkAttributeSet(attributeSet, "multiscript-type", "pre");
- else if (coreObject->isMathMultiscriptObject(PostSuperscript) || coreObject->isMathMultiscriptObject(PostSubscript))
- attributeSet = addToAtkAttributeSet(attributeSet, "multiscript-type", "post");
- }
-
// Set the 'layout-guess' attribute to help Assistive
// Technologies know when an exposed table is not data table.
- if (is<AccessibilityTable>(*coreObject) && downcast<AccessibilityTable>(*coreObject).isExposableThroughAccessibility() && !coreObject->isDataTable())
+ if (coreObject->isAccessibilityTable() && !coreObject->isDataTable())
attributeSet = addToAtkAttributeSet(attributeSet, "layout-guess", "true");
String placeholder = coreObject->placeholderValue();
@@ -448,28 +543,30 @@ static AtkAttributeSet* webkitAccessibleGetAttributes(AtkObject* object)
attributeSet = addToAtkAttributeSet(attributeSet, "sort", sortAttribute.string().utf8().data());
}
- if (coreObject->supportsARIAPosInSet())
- attributeSet = addToAtkAttributeSet(attributeSet, "posinset", String::number(coreObject->ariaPosInSet()).utf8().data());
-
- if (coreObject->supportsARIASetSize())
- attributeSet = addToAtkAttributeSet(attributeSet, "setsize", String::number(coreObject->ariaSetSize()).utf8().data());
-
- String isReadOnly = coreObject->ariaReadOnlyValue();
- if (!isReadOnly.isEmpty())
- attributeSet = addToAtkAttributeSet(attributeSet, "readonly", isReadOnly.utf8().data());
-
- // According to the W3C Core Accessibility API Mappings 1.1, section 5.4.1 General Rules:
- // "User agents must expose the WAI-ARIA role string if the API supports a mechanism to do so."
- // In the case of ATK, the mechanism to do so is an object attribute pair (xml-roles:"string").
- // The computedRoleString is primarily for testing, and not limited to elements with ARIA roles.
- // Because the computedRoleString currently contains the ARIA role string, we'll use it for
- // both purposes, as the "computed-role" object attribute for all elements which have a value
- // and also via the "xml-roles" attribute for elements with ARIA, as well as for landmarks.
- String roleString = coreObject->computedRoleString();
- if (!roleString.isEmpty()) {
- if (coreObject->ariaRoleAttribute() != UnknownRole || coreObject->isLandmark())
- attributeSet = addToAtkAttributeSet(attributeSet, "xml-roles", roleString.utf8().data());
- attributeSet = addToAtkAttributeSet(attributeSet, "computed-role", roleString.utf8().data());
+ // Landmarks will be exposed with xml-roles object attributes, with the exception
+ // of LandmarkApplicationRole, which will be exposed with ATK_ROLE_EMBEDDED.
+ AccessibilityRole role = coreObject->roleValue();
+ switch (role) {
+ case LandmarkBannerRole:
+ attributeSet = addToAtkAttributeSet(attributeSet, "xml-roles", "banner");
+ break;
+ case LandmarkComplementaryRole:
+ attributeSet = addToAtkAttributeSet(attributeSet, "xml-roles", "complementary");
+ break;
+ case LandmarkContentInfoRole:
+ attributeSet = addToAtkAttributeSet(attributeSet, "xml-roles", "contentinfo");
+ break;
+ case LandmarkMainRole:
+ attributeSet = addToAtkAttributeSet(attributeSet, "xml-roles", "main");
+ break;
+ case LandmarkNavigationRole:
+ attributeSet = addToAtkAttributeSet(attributeSet, "xml-roles", "navigation");
+ break;
+ case LandmarkSearchRole:
+ attributeSet = addToAtkAttributeSet(attributeSet, "xml-roles", "search");
+ break;
+ default:
+ break;
}
return attributeSet;
@@ -489,17 +586,10 @@ static AtkRole atkRole(AccessibilityObject* coreObject)
case UnknownRole:
return ATK_ROLE_UNKNOWN;
case AudioRole:
-#if ATK_CHECK_VERSION(2, 11, 3)
- return ATK_ROLE_AUDIO;
-#endif
case VideoRole:
-#if ATK_CHECK_VERSION(2, 11, 3)
- return ATK_ROLE_VIDEO;
-#endif
return ATK_ROLE_EMBEDDED;
case ButtonRole:
return ATK_ROLE_PUSH_BUTTON;
- case SwitchRole:
case ToggleButtonRole:
return ATK_ROLE_TOGGLE_BUTTON;
case RadioButtonRole:
@@ -513,7 +603,6 @@ static AtkRole atkRole(AccessibilityObject* coreObject)
return ATK_ROLE_PAGE_TAB_LIST;
case TextFieldRole:
case TextAreaRole:
- case SearchFieldRole:
return ATK_ROLE_ENTRY;
case StaticTextRole:
return ATK_ROLE_TEXT;
@@ -538,7 +627,8 @@ static AtkRole atkRole(AccessibilityObject* coreObject)
// return ATK_ROLE_TABLE_COLUMN_HEADER; // Is this right?
return ATK_ROLE_UNKNOWN; // Matches Mozilla
case RowRole:
- return ATK_ROLE_TABLE_ROW;
+ // return ATK_ROLE_TABLE_ROW_HEADER; // Is this right?
+ return ATK_ROLE_LIST_ITEM; // Matches Mozilla
case ToolbarRole:
return ATK_ROLE_TOOL_BAR;
case BusyIndicatorRole:
@@ -556,44 +646,31 @@ static AtkRole atkRole(AccessibilityObject* coreObject)
case SplitterRole:
return ATK_ROLE_SEPARATOR;
case ColorWellRole:
-#if PLATFORM(GTK)
- // ATK_ROLE_COLOR_CHOOSER is defined as a dialog (i.e. it's what appears when you push the button).
- return ATK_ROLE_PUSH_BUTTON;
-#elif PLATFORM(EFL)
return ATK_ROLE_COLOR_CHOOSER;
-#endif
case ListRole:
return ATK_ROLE_LIST;
case ScrollBarRole:
return ATK_ROLE_SCROLL_BAR;
case ScrollAreaRole:
return ATK_ROLE_SCROLL_PANE;
- case GridRole:
+ case GridRole: // Is this right?
case TableRole:
return ATK_ROLE_TABLE;
case ApplicationRole:
return ATK_ROLE_APPLICATION;
- case DocumentRegionRole:
+ case GroupRole:
case RadioGroupRole:
case TabPanelRole:
return ATK_ROLE_PANEL;
- case GroupRole:
- return coreObject->isStyleFormatGroup() ? ATK_ROLE_SECTION : ATK_ROLE_PANEL;
- case RowHeaderRole:
- return ATK_ROLE_ROW_HEADER;
- case ColumnHeaderRole:
- return ATK_ROLE_COLUMN_HEADER;
- case CaptionRole:
- return ATK_ROLE_CAPTION;
+ case RowHeaderRole: // Row headers are cells after all.
+ case ColumnHeaderRole: // Column headers are cells after all.
case CellRole:
- case GridCellRole:
- return coreObject->inheritsPresentationalRole() ? ATK_ROLE_SECTION : ATK_ROLE_TABLE_CELL;
+ return ATK_ROLE_TABLE_CELL;
case LinkRole:
case WebCoreLinkRole:
case ImageMapLinkRole:
return ATK_ROLE_LINK;
case ImageMapRole:
- return ATK_ROLE_IMAGE_MAP;
case ImageRole:
return ATK_ROLE_IMAGE;
case ListMarkerRole:
@@ -609,9 +686,8 @@ static AtkRole atkRole(AccessibilityObject* coreObject)
case HeadingRole:
return ATK_ROLE_HEADING;
case ListBoxRole:
- return ATK_ROLE_LIST_BOX;
+ return ATK_ROLE_LIST;
case ListItemRole:
- return coreObject->inheritsPresentationalRole() ? ATK_ROLE_SECTION : ATK_ROLE_LIST_ITEM;
case ListBoxOptionRole:
return ATK_ROLE_LIST_ITEM;
case ParagraphRole:
@@ -619,15 +695,8 @@ static AtkRole atkRole(AccessibilityObject* coreObject)
case LabelRole:
case LegendRole:
return ATK_ROLE_LABEL;
- case BlockquoteRole:
-#if ATK_CHECK_VERSION(2, 11, 3)
- return ATK_ROLE_BLOCK_QUOTE;
-#endif
case DivRole:
- case PreRole:
return ATK_ROLE_SECTION;
- case FooterRole:
- return ATK_ROLE_FOOTER;
case FormRole:
return ATK_ROLE_FORM;
case CanvasRole:
@@ -655,34 +724,6 @@ static AtkRole atkRole(AccessibilityObject* coreObject)
return ATK_ROLE_DEFINITION;
case DocumentMathRole:
return ATK_ROLE_MATH;
- case MathElementRole:
- if (coreObject->isMathRow())
- return ATK_ROLE_PANEL;
- if (coreObject->isMathTable())
- return ATK_ROLE_TABLE;
- if (coreObject->isMathTableRow())
- return ATK_ROLE_TABLE_ROW;
- if (coreObject->isMathTableCell())
- return ATK_ROLE_TABLE_CELL;
- if (coreObject->isMathSubscriptSuperscript() || coreObject->isMathMultiscript())
- return ATK_ROLE_SECTION;
-#if ATK_CHECK_VERSION(2, 15, 4)
- if (coreObject->isMathFraction())
- return ATK_ROLE_MATH_FRACTION;
- if (coreObject->isMathSquareRoot() || coreObject->isMathRoot())
- return ATK_ROLE_MATH_ROOT;
- if (coreObject->isMathScriptObject(Subscript)
- || coreObject->isMathMultiscriptObject(PreSubscript) || coreObject->isMathMultiscriptObject(PostSubscript))
- return ATK_ROLE_SUBSCRIPT;
- if (coreObject->isMathScriptObject(Superscript)
- || coreObject->isMathMultiscriptObject(PreSuperscript) || coreObject->isMathMultiscriptObject(PostSuperscript))
- return ATK_ROLE_SUPERSCRIPT;
-#endif
-#if ATK_CHECK_VERSION(2, 15, 2)
- if (coreObject->isMathToken())
- return ATK_ROLE_STATIC;
-#endif
- return ATK_ROLE_UNKNOWN;
case LandmarkBannerRole:
case LandmarkComplementaryRole:
case LandmarkContentInfoRole:
@@ -699,10 +740,6 @@ static AtkRole atkRole(AccessibilityObject* coreObject)
case DescriptionListDetailRole:
return ATK_ROLE_DESCRIPTION_VALUE;
#endif
-#if ATK_CHECK_VERSION(2, 15, 2)
- case InlineRole:
- return ATK_ROLE_STATIC;
-#endif
default:
return ATK_ROLE_UNKNOWN;
}
@@ -766,15 +803,16 @@ static void setAtkStateSetFromCoreObject(AccessibilityObject* coreObject, AtkSta
if (isListBoxOption && coreObject->isSelectedOptionActive())
atk_state_set_add_state(stateSet, ATK_STATE_ACTIVE);
-#if ATK_CHECK_VERSION(2,11,2)
- if (coreObject->supportsChecked() && coreObject->canSetValueAttribute())
- atk_state_set_add_state(stateSet, ATK_STATE_CHECKABLE);
-#endif
-
if (coreObject->isChecked())
atk_state_set_add_state(stateSet, ATK_STATE_CHECKED);
- if ((coreObject->isTextControl() || coreObject->isNonNativeTextControl()) && coreObject->canSetValueAttribute())
+ // FIXME: isReadOnly does not seem to do the right thing for
+ // controls, so check explicitly for them. In addition, because
+ // isReadOnly is false for listBoxOptions, we need to add one
+ // more check so that we do not present them as being "editable".
+ if ((!coreObject->isReadOnly()
+ || (coreObject->isControl() && coreObject->canSetValueAttribute()))
+ && !isListBoxOption)
atk_state_set_add_state(stateSet, ATK_STATE_EDITABLE);
// FIXME: Put both ENABLED and SENSITIVE together here for now
@@ -819,11 +857,6 @@ static void setAtkStateSetFromCoreObject(AccessibilityObject* coreObject, AtkSta
if (coreObject->isPressed())
atk_state_set_add_state(stateSet, ATK_STATE_PRESSED);
-#if ATK_CHECK_VERSION(2,15,3)
- if (!coreObject->canSetValueAttribute() && (coreObject->supportsARIAReadOnly()))
- atk_state_set_add_state(stateSet, ATK_STATE_READ_ONLY);
-#endif
-
if (coreObject->isRequired())
atk_state_set_add_state(stateSet, ATK_STATE_REQUIRED);
@@ -932,7 +965,7 @@ static const gchar* webkitAccessibleGetObjectLocale(AtkObject* object)
return cacheAndReturnAtkProperty(object, AtkCachedDocumentLocale, language);
} else if (ATK_IS_TEXT(object)) {
- const gchar* locale = nullptr;
+ const gchar* locale = 0;
AtkAttributeSet* textAttributes = atk_text_get_default_attributes(ATK_TEXT(object));
for (AtkAttributeSet* attributes = textAttributes; attributes; attributes = attributes->next) {
@@ -1013,9 +1046,6 @@ static const GInterfaceInfo AtkInterfacesInitFunctions[] = {
{reinterpret_cast<GInterfaceInitFunc>(webkitAccessibleComponentInterfaceInit), 0, 0},
{reinterpret_cast<GInterfaceInitFunc>(webkitAccessibleImageInterfaceInit), 0, 0},
{reinterpret_cast<GInterfaceInitFunc>(webkitAccessibleTableInterfaceInit), 0, 0},
-#if ATK_CHECK_VERSION(2,11,90)
- {reinterpret_cast<GInterfaceInitFunc>(webkitAccessibleTableCellInterfaceInit), 0, 0},
-#endif
{reinterpret_cast<GInterfaceInitFunc>(webkitAccessibleHypertextInterfaceInit), 0, 0},
{reinterpret_cast<GInterfaceInitFunc>(webkitAccessibleHyperlinkImplInterfaceInit), 0, 0},
{reinterpret_cast<GInterfaceInitFunc>(webkitAccessibleDocumentInterfaceInit), 0, 0},
@@ -1023,50 +1053,43 @@ static const GInterfaceInfo AtkInterfacesInitFunctions[] = {
};
enum WAIType {
- WAIAction,
- WAISelection,
- WAIEditableText,
- WAIText,
- WAIComponent,
- WAIImage,
- WAITable,
-#if ATK_CHECK_VERSION(2,11,90)
- WAITableCell,
-#endif
- WAIHypertext,
- WAIHyperlink,
- WAIDocument,
- WAIValue,
+ WAI_ACTION,
+ WAI_SELECTION,
+ WAI_EDITABLE_TEXT,
+ WAI_TEXT,
+ WAI_COMPONENT,
+ WAI_IMAGE,
+ WAI_TABLE,
+ WAI_HYPERTEXT,
+ WAI_HYPERLINK,
+ WAI_DOCUMENT,
+ WAI_VALUE,
};
static GType GetAtkInterfaceTypeFromWAIType(WAIType type)
{
switch (type) {
- case WAIAction:
+ case WAI_ACTION:
return ATK_TYPE_ACTION;
- case WAISelection:
+ case WAI_SELECTION:
return ATK_TYPE_SELECTION;
- case WAIEditableText:
+ case WAI_EDITABLE_TEXT:
return ATK_TYPE_EDITABLE_TEXT;
- case WAIText:
+ case WAI_TEXT:
return ATK_TYPE_TEXT;
- case WAIComponent:
+ case WAI_COMPONENT:
return ATK_TYPE_COMPONENT;
- case WAIImage:
+ case WAI_IMAGE:
return ATK_TYPE_IMAGE;
- case WAITable:
+ case WAI_TABLE:
return ATK_TYPE_TABLE;
-#if ATK_CHECK_VERSION(2,11,90)
- case WAITableCell:
- return ATK_TYPE_TABLE_CELL;
-#endif
- case WAIHypertext:
+ case WAI_HYPERTEXT:
return ATK_TYPE_HYPERTEXT;
- case WAIHyperlink:
+ case WAI_HYPERLINK:
return ATK_TYPE_HYPERLINK_IMPL;
- case WAIDocument:
+ case WAI_DOCUMENT:
return ATK_TYPE_DOCUMENT;
- case WAIValue:
+ case WAI_VALUE:
return ATK_TYPE_VALUE;
}
@@ -1076,8 +1099,7 @@ static GType GetAtkInterfaceTypeFromWAIType(WAIType type)
static bool roleIsTextType(AccessibilityRole role)
{
return role == ParagraphRole || role == HeadingRole || role == DivRole || role == CellRole
- || role == LinkRole || role == WebCoreLinkRole || role == ListItemRole || role == PreRole
- || role == GridCellRole;
+ || role == LinkRole || role == WebCoreLinkRole || role == ListItemRole;
}
static guint16 getInterfaceMaskFromObject(AccessibilityObject* coreObject)
@@ -1085,7 +1107,7 @@ static guint16 getInterfaceMaskFromObject(AccessibilityObject* coreObject)
guint16 interfaceMask = 0;
// Component interface is always supported
- interfaceMask |= 1 << WAIComponent;
+ interfaceMask |= 1 << WAI_COMPONENT;
AccessibilityRole role = coreObject->roleValue();
@@ -1095,71 +1117,68 @@ static guint16 getInterfaceMaskFromObject(AccessibilityObject* coreObject)
// object, and only supports having one action per object), it is
// better just to implement this interface for every instance of
// the WebKitAccessible class and let WebCore decide what to do.
- interfaceMask |= 1 << WAIAction;
+ interfaceMask |= 1 << WAI_ACTION;
// Selection
if (coreObject->isListBox() || coreObject->isMenuList())
- interfaceMask |= 1 << WAISelection;
+ interfaceMask |= 1 << WAI_SELECTION;
// Get renderer if available.
- RenderObject* renderer = nullptr;
+ RenderObject* renderer = 0;
if (coreObject->isAccessibilityRenderObject())
renderer = coreObject->renderer();
// Hyperlink (links and embedded objects).
if (coreObject->isLink() || (renderer && renderer->isReplaced()))
- interfaceMask |= 1 << WAIHyperlink;
+ interfaceMask |= 1 << WAI_HYPERLINK;
- // Text, Editable Text & Hypertext
+ // Text & Editable Text
if (role == StaticTextRole || coreObject->isMenuListOption())
- interfaceMask |= 1 << WAIText;
- else if (coreObject->isTextControl() || coreObject->isNonNativeTextControl()) {
- interfaceMask |= 1 << WAIText;
- if (coreObject->canSetValueAttribute())
- interfaceMask |= 1 << WAIEditableText;
- } else if (!coreObject->isWebArea()) {
- if (role != TableRole) {
- interfaceMask |= 1 << WAIHypertext;
- if ((renderer && renderer->childrenInline()) || roleIsTextType(role) || coreObject->isMathToken())
- interfaceMask |= 1 << WAIText;
- }
+ interfaceMask |= 1 << WAI_TEXT;
+ else {
+ if (coreObject->isTextControl()) {
+ interfaceMask |= 1 << WAI_TEXT;
+ if (!coreObject->isReadOnly())
+ interfaceMask |= 1 << WAI_EDITABLE_TEXT;
+ } else {
+ if (role != TableRole) {
+ interfaceMask |= 1 << WAI_HYPERTEXT;
+ if ((renderer && renderer->childrenInline()) || roleIsTextType(role))
+ interfaceMask |= 1 << WAI_TEXT;
+ }
- // Add the TEXT interface for list items whose
- // first accessible child has a text renderer
- if (role == ListItemRole) {
- const AccessibilityObject::AccessibilityChildrenVector& children = coreObject->children();
- if (children.size()) {
- AccessibilityObject* axRenderChild = children.at(0).get();
- interfaceMask |= getInterfaceMaskFromObject(axRenderChild);
+ // Add the TEXT interface for list items whose
+ // first accessible child has a text renderer
+ if (role == ListItemRole) {
+ const AccessibilityObject::AccessibilityChildrenVector& children = coreObject->children();
+ if (children.size()) {
+ AccessibilityObject* axRenderChild = children.at(0).get();
+ interfaceMask |= getInterfaceMaskFromObject(axRenderChild);
+ }
}
}
}
// Image
if (coreObject->isImage())
- interfaceMask |= 1 << WAIImage;
+ interfaceMask |= 1 << WAI_IMAGE;
// Table
- if (role == TableRole || role == GridRole)
- interfaceMask |= 1 << WAITable;
-
-#if ATK_CHECK_VERSION(2,11,90)
- if (role == CellRole || role == ColumnHeaderRole || role == RowHeaderRole)
- interfaceMask |= 1 << WAITableCell;
-#endif
+ if (role == TableRole)
+ interfaceMask |= 1 << WAI_TABLE;
// Document
if (role == WebAreaRole)
- interfaceMask |= 1 << WAIDocument;
+ interfaceMask |= 1 << WAI_DOCUMENT;
// Value
if (role == SliderRole || role == SpinButtonRole || role == ScrollBarRole || role == ProgressIndicatorRole)
- interfaceMask |= 1 << WAIValue;
+ interfaceMask |= 1 << WAI_VALUE;
#if ENABLE(INPUT_TYPE_COLOR)
// Color type.
if (role == ColorWellRole)
- interfaceMask |= 1 << WAIText;
+ interfaceMask |= 1 << WAI_TEXT;
#endif
return interfaceMask;
@@ -1242,6 +1261,18 @@ bool webkitAccessibleIsDetached(WebKitAccessible* accessible)
return accessible->m_object == fallbackObject();
}
+AtkObject* webkitAccessibleGetFocusedElement(WebKitAccessible* accessible)
+{
+ if (!accessible->m_object)
+ return 0;
+
+ RefPtr<AccessibilityObject> focusedObj = accessible->m_object->focusedUIElement();
+ if (!focusedObj)
+ return 0;
+
+ return focusedObj->wrapper();
+}
+
AccessibilityObject* objectFocusedAndCaretOffsetUnignored(AccessibilityObject* referenceObject, int& offset)
{
// Indication that something bogus has transpired.
@@ -1283,7 +1314,7 @@ AccessibilityObject* objectFocusedAndCaretOffsetUnignored(AccessibilityObject* r
if (referenceObject->isDescendantOfObject(firstUnignoredParent))
referenceObject = firstUnignoredParent;
- Node* startNode = nullptr;
+ Node* startNode = 0;
if (firstUnignoredParent != referenceObject || firstUnignoredParent->isTextControl()) {
// We need to use the first child's node of the reference
// object as the start point to calculate the caret offset
@@ -1325,7 +1356,7 @@ AccessibilityObject* objectFocusedAndCaretOffsetUnignored(AccessibilityObject* r
const char* cacheAndReturnAtkProperty(AtkObject* object, AtkCachedProperty property, String value)
{
WebKitAccessiblePrivate* priv = WEBKIT_ACCESSIBLE(object)->priv;
- CString* propertyPtr = nullptr;
+ CString* propertyPtr = 0;
switch (property) {
case AtkCachedAccessibleName: