diff options
| author | Lorry Tar Creator <lorry-tar-importer@lorry> | 2016-04-10 09:28:39 +0000 |
|---|---|---|
| committer | Lorry Tar Creator <lorry-tar-importer@lorry> | 2016-04-10 09:28:39 +0000 |
| commit | 32761a6cee1d0dee366b885b7b9c777e67885688 (patch) | |
| tree | d6bec92bebfb216f4126356e55518842c2f476a1 /Source/WebCore/accessibility/atk/WebKitAccessibleWrapperAtk.cpp | |
| parent | a4e969f4965059196ca948db781e52f7cfebf19e (diff) | |
| download | WebKitGtk-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.cpp | 459 |
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: |
