diff options
Diffstat (limited to 'Source/WebCore/accessibility/AccessibilityObject.h')
-rw-r--r-- | Source/WebCore/accessibility/AccessibilityObject.h | 614 |
1 files changed, 614 insertions, 0 deletions
diff --git a/Source/WebCore/accessibility/AccessibilityObject.h b/Source/WebCore/accessibility/AccessibilityObject.h new file mode 100644 index 0000000..45b54fc --- /dev/null +++ b/Source/WebCore/accessibility/AccessibilityObject.h @@ -0,0 +1,614 @@ +/* + * Copyright (C) 2008, 2009 Apple Inc. All rights reserved. + * Copyright (C) 2008 Nuanti Ltd. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef AccessibilityObject_h +#define AccessibilityObject_h + +#include "IntRect.h" +#include "Range.h" +#include "VisiblePosition.h" +#include "VisibleSelection.h" +#include <wtf/Forward.h> +#include <wtf/RefPtr.h> +#include <wtf/Vector.h> + +#if PLATFORM(MAC) +#include <wtf/RetainPtr.h> +#elif PLATFORM(WIN) && !OS(WINCE) +#include "AccessibilityObjectWrapperWin.h" +#include "COMPtr.h" +#elif PLATFORM(CHROMIUM) +#include "AccessibilityObjectWrapper.h" +#endif + +typedef struct _NSRange NSRange; + +#ifdef __OBJC__ +@class AccessibilityObjectWrapper; +@class NSArray; +@class NSAttributedString; +@class NSData; +@class NSMutableAttributedString; +@class NSString; +@class NSValue; +@class NSView; +#else +class NSArray; +class NSAttributedString; +class NSData; +class NSMutableAttributedString; +class NSString; +class NSValue; +class NSView; +#if PLATFORM(GTK) +typedef struct _AtkObject AtkObject; +typedef struct _AtkObject AccessibilityObjectWrapper; +#else +class AccessibilityObjectWrapper; +#endif +#endif + +namespace WebCore { + +class AXObjectCache; +class Element; +class Frame; +class FrameView; +class HTMLAnchorElement; +class HTMLAreaElement; +class IntPoint; +class IntSize; +class Node; +class RenderObject; +class RenderListItem; +class VisibleSelection; +class Widget; + +typedef unsigned AXID; + +enum AccessibilityRole { + UnknownRole = 1, + ButtonRole, + RadioButtonRole, + CheckBoxRole, + SliderRole, + TabGroupRole, + TextFieldRole, + StaticTextRole, + TextAreaRole, + ScrollAreaRole, + PopUpButtonRole, + MenuButtonRole, + TableRole, + ApplicationRole, + GroupRole, + RadioGroupRole, + ListRole, + ScrollBarRole, + ValueIndicatorRole, + ImageRole, + MenuBarRole, + MenuRole, + MenuItemRole, + ColumnRole, + RowRole, + ToolbarRole, + BusyIndicatorRole, + ProgressIndicatorRole, + WindowRole, + DrawerRole, + SystemWideRole, + OutlineRole, + IncrementorRole, + BrowserRole, + ComboBoxRole, + SplitGroupRole, + SplitterRole, + ColorWellRole, + GrowAreaRole, + SheetRole, + HelpTagRole, + MatteRole, + RulerRole, + RulerMarkerRole, + LinkRole, + DisclosureTriangleRole, + GridRole, + CellRole, + ColumnHeaderRole, + RowHeaderRole, + // AppKit includes SortButtonRole but it is misnamed and really a subrole of ButtonRole so we do not include it here. + + // WebCore-specific roles + WebCoreLinkRole, + ImageMapLinkRole, + ImageMapRole, + ListMarkerRole, + WebAreaRole, + HeadingRole, + ListBoxRole, + ListBoxOptionRole, + TableHeaderContainerRole, + DefinitionListTermRole, + DefinitionListDefinitionRole, + AnnotationRole, + SliderThumbRole, + IgnoredRole, + PresentationalRole, + TabRole, + TabListRole, + TabPanelRole, + TreeRole, + TreeGridRole, + TreeItemRole, + DirectoryRole, + EditableTextRole, + ListItemRole, + MenuListPopupRole, + MenuListOptionRole, + + // ARIA Grouping roles + LandmarkApplicationRole, + LandmarkBannerRole, + LandmarkComplementaryRole, + LandmarkContentInfoRole, + LandmarkMainRole, + LandmarkNavigationRole, + LandmarkSearchRole, + + ApplicationAlertRole, + ApplicationAlertDialogRole, + ApplicationDialogRole, + ApplicationLogRole, + ApplicationMarqueeRole, + ApplicationStatusRole, + ApplicationTimerRole, + + DocumentRole, + DocumentArticleRole, + DocumentMathRole, + DocumentNoteRole, + DocumentRegionRole, + + UserInterfaceTooltipRole +}; + +enum AccessibilityOrientation { + AccessibilityOrientationVertical, + AccessibilityOrientationHorizontal, +}; + +enum AccessibilityObjectInclusion { + IncludeObject, + IgnoreObject, + DefaultBehavior, +}; + +enum AccessibilityButtonState { + ButtonStateOff = 0, + ButtonStateOn, + ButtonStateMixed, +}; + +struct VisiblePositionRange { + + VisiblePosition start; + VisiblePosition end; + + VisiblePositionRange() {} + + VisiblePositionRange(const VisiblePosition& s, const VisiblePosition& e) + : start(s) + , end(e) + { } + + bool isNull() const { return start.isNull() || end.isNull(); } +}; + +struct PlainTextRange { + + unsigned start; + unsigned length; + + PlainTextRange() + : start(0) + , length(0) + { } + + PlainTextRange(unsigned s, unsigned l) + : start(s) + , length(l) + { } + + bool isNull() const { return !start && !length; } +}; + +class AccessibilityObject : public RefCounted<AccessibilityObject> { +protected: + AccessibilityObject(); +public: + virtual ~AccessibilityObject(); + virtual void detach(); + + typedef Vector<RefPtr<AccessibilityObject> > AccessibilityChildrenVector; + + virtual bool isAccessibilityRenderObject() const { return false; } + virtual bool isAccessibilityScrollbar() const { return false; } + virtual bool isAccessibilityScrollView() const { return false; } + + virtual bool isAnchor() const { return false; } + virtual bool isAttachment() const { return false; } + virtual bool isHeading() const { return false; } + virtual bool isLink() const { return false; } + virtual bool isImage() const { return false; } + virtual bool isNativeImage() const { return false; } + virtual bool isImageButton() const { return false; } + virtual bool isPasswordField() const { return false; } + virtual bool isNativeTextControl() const { return false; } + virtual bool isWebArea() const { return false; } + virtual bool isCheckbox() const { return roleValue() == CheckBoxRole; } + virtual bool isRadioButton() const { return roleValue() == RadioButtonRole; } + virtual bool isListBox() const { return roleValue() == ListBoxRole; } + virtual bool isMediaTimeline() const { return false; } + virtual bool isMenuRelated() const { return false; } + virtual bool isMenu() const { return false; } + virtual bool isMenuBar() const { return false; } + virtual bool isMenuButton() const { return false; } + virtual bool isMenuItem() const { return false; } + virtual bool isFileUploadButton() const { return false; } + virtual bool isInputImage() const { return false; } + virtual bool isProgressIndicator() const { return false; } + virtual bool isSlider() const { return false; } + virtual bool isInputSlider() const { return false; } + virtual bool isControl() const { return false; } + virtual bool isList() const { return false; } + virtual bool isAccessibilityTable() const { return false; } + virtual bool isDataTable() const { return false; } + virtual bool isTableRow() const { return false; } + virtual bool isTableColumn() const { return false; } + virtual bool isTableCell() const { return false; } + virtual bool isFieldset() const { return false; } + virtual bool isGroup() const { return false; } + virtual bool isARIATreeGridRow() const { return false; } + virtual bool isImageMapLink() const { return false; } + virtual bool isMenuList() const { return false; } + virtual bool isMenuListPopup() const { return false; } + virtual bool isMenuListOption() const { return false; } + bool isTextControl() const { return roleValue() == TextAreaRole || roleValue() == TextFieldRole; } + bool isTabList() const { return roleValue() == TabListRole; } + bool isTabItem() const { return roleValue() == TabRole; } + bool isRadioGroup() const { return roleValue() == RadioGroupRole; } + bool isComboBox() const { return roleValue() == ComboBoxRole; } + bool isTree() const { return roleValue() == TreeRole; } + bool isTreeItem() const { return roleValue() == TreeItemRole; } + bool isScrollbar() const { return roleValue() == ScrollBarRole; } + bool isButton() const { return roleValue() == ButtonRole; } + bool isListItem() const { return roleValue() == ListItemRole; } + bool isCheckboxOrRadio() const { return isCheckbox() || isRadioButton(); } + bool isScrollView() const { return roleValue() == ScrollAreaRole; } + + virtual bool isChecked() const { return false; } + virtual bool isEnabled() const { return false; } + virtual bool isSelected() const { return false; } + virtual bool isFocused() const { return false; } + virtual bool isHovered() const { return false; } + virtual bool isIndeterminate() const { return false; } + virtual bool isLoaded() const { return false; } + virtual bool isMultiSelectable() const { return false; } + virtual bool isOffScreen() const { return false; } + virtual bool isPressed() const { return false; } + virtual bool isReadOnly() const { return false; } + virtual bool isVisited() const { return false; } + virtual bool isRequired() const { return false; } + virtual bool isLinked() const { return false; } + virtual bool isExpanded() const; + virtual bool isVisible() const { return true; } + virtual bool isCollapsed() const { return false; } + virtual void setIsExpanded(bool) { } + + virtual bool canSetFocusAttribute() const { return false; } + virtual bool canSetTextRangeAttributes() const { return false; } + virtual bool canSetValueAttribute() const { return false; } + virtual bool canSetNumericValue() const { return false; } + virtual bool canSetSelectedAttribute() const { return false; } + virtual bool canSetSelectedChildrenAttribute() const { return false; } + virtual bool canSetExpandedAttribute() const { return false; } + + // A programmatic way to set a name on an AccessibleObject. + virtual void setAccessibleName(String&) { } + + virtual Node* node() const { return 0; } + bool accessibilityShouldUseUniqueId() const { return true; } + virtual bool accessibilityIsIgnored() const { return true; } + + virtual int headingLevel() const { return 0; } + virtual AccessibilityButtonState checkboxOrRadioValue() const; + virtual String valueDescription() const { return String(); } + virtual float valueForRange() const { return 0.0f; } + virtual float maxValueForRange() const { return 0.0f; } + virtual float minValueForRange() const { return 0.0f; } + virtual AccessibilityObject* selectedRadioButton() { return 0; } + virtual AccessibilityObject* selectedTabItem() { return 0; } + virtual int layoutCount() const { return 0; } + virtual double estimatedLoadingProgress() const { return 0; } + static bool isARIAControl(AccessibilityRole); + static bool isARIAInput(AccessibilityRole); + virtual bool supportsARIAOwns() const { return false; } + virtual void ariaOwnsElements(AccessibilityChildrenVector&) const { } + virtual bool supportsARIAFlowTo() const { return false; } + virtual void ariaFlowToElements(AccessibilityChildrenVector&) const { } + virtual bool ariaHasPopup() const { return false; } + bool ariaIsMultiline() const; + virtual const AtomicString& invalidStatus() const; + bool supportsARIAExpanded() const; + + // ARIA drag and drop + virtual bool supportsARIADropping() const { return false; } + virtual bool supportsARIADragging() const { return false; } + virtual bool isARIAGrabbed() { return false; } + virtual void setARIAGrabbed(bool) { } + virtual void determineARIADropEffects(Vector<String>&) { } + + // Called on the root AX object to return the deepest available element. + virtual AccessibilityObject* accessibilityHitTest(const IntPoint&) const { return 0; } + // Called on the AX object after the render tree determines which is the right AccessibilityRenderObject. + virtual AccessibilityObject* elementAccessibilityHitTest(const IntPoint&) const; + + virtual AccessibilityObject* focusedUIElement() const; + + virtual AccessibilityObject* firstChild() const { return 0; } + virtual AccessibilityObject* lastChild() const { return 0; } + virtual AccessibilityObject* previousSibling() const { return 0; } + virtual AccessibilityObject* nextSibling() const { return 0; } + virtual AccessibilityObject* parentObject() const = 0; + virtual AccessibilityObject* parentObjectUnignored() const; + virtual AccessibilityObject* parentObjectIfExists() const { return 0; } + static AccessibilityObject* firstAccessibleObjectFromNode(const Node*); + + virtual AccessibilityObject* observableObject() const { return 0; } + virtual void linkedUIElements(AccessibilityChildrenVector&) const { } + virtual AccessibilityObject* titleUIElement() const { return 0; } + virtual bool exposesTitleUIElement() const { return true; } + virtual AccessibilityObject* correspondingControlForLabelElement() const { return 0; } + virtual AccessibilityObject* scrollBar(AccessibilityOrientation) const { return 0; } + + virtual AccessibilityRole ariaRoleAttribute() const { return UnknownRole; } + virtual bool isPresentationalChildOfAriaRole() const { return false; } + virtual bool ariaRoleHasPresentationalChildren() const { return false; } + + void setRoleValue(AccessibilityRole role) { m_role = role; } + virtual AccessibilityRole roleValue() const { return m_role; } + virtual String ariaLabeledByAttribute() const { return String(); } + virtual String ariaDescribedByAttribute() const { return String(); } + virtual String accessibilityDescription() const { return String(); } + + virtual AXObjectCache* axObjectCache() const; + AXID axObjectID() const { return m_id; } + void setAXObjectID(AXID axObjectID) { m_id = axObjectID; } + + static AccessibilityObject* anchorElementForNode(Node*); + virtual Element* anchorElement() const { return 0; } + virtual Element* actionElement() const { return 0; } + virtual IntRect boundingBoxRect() const { return IntRect(); } + virtual IntRect elementRect() const = 0; + virtual IntSize size() const { return elementRect().size(); } + virtual IntPoint clickPoint() const; + + virtual PlainTextRange selectedTextRange() const { return PlainTextRange(); } + unsigned selectionStart() const { return selectedTextRange().start; } + unsigned selectionEnd() const { return selectedTextRange().length; } + + virtual KURL url() const { return KURL(); } + virtual VisibleSelection selection() const { return VisibleSelection(); } + virtual String stringValue() const { return String(); } + virtual String title() const { return String(); } + virtual String helpText() const { return String(); } + virtual String textUnderElement() const { return String(); } + virtual String text() const { return String(); } + virtual int textLength() const { return 0; } + virtual String selectedText() const { return String(); } + virtual const AtomicString& accessKey() const { return nullAtom; } + const String& actionVerb() const; + virtual Widget* widget() const { return 0; } + virtual Widget* widgetForAttachmentView() const { return 0; } + virtual Document* document() const { return 0; } + virtual FrameView* topDocumentFrameView() const { return 0; } + virtual FrameView* documentFrameView() const; + String language() const; + virtual unsigned hierarchicalLevel() const { return 0; } + const AtomicString& placeholderValue() const; + + virtual void setFocused(bool) { } + virtual void setSelectedText(const String&) { } + virtual void setSelectedTextRange(const PlainTextRange&) { } + virtual void setValue(const String&) { } + virtual void setValue(float) { } + virtual void setSelected(bool) { } + virtual void setSelectedRows(AccessibilityChildrenVector&) { } + + virtual void makeRangeVisible(const PlainTextRange&) { } + virtual bool press() const; + bool performDefaultAction() const { return press(); } + + virtual AccessibilityOrientation orientation() const; + virtual void increment() { } + virtual void decrement() { } + + virtual void childrenChanged() { } + virtual void contentChanged() { } + virtual const AccessibilityChildrenVector& children() { return m_children; } + virtual void addChildren() { } + virtual bool canHaveChildren() const { return true; } + virtual bool hasChildren() const { return m_haveChildren; } + virtual void updateChildrenIfNecessary(); + virtual void selectedChildren(AccessibilityChildrenVector&) { } + virtual void visibleChildren(AccessibilityChildrenVector&) { } + virtual void tabChildren(AccessibilityChildrenVector&) { } + virtual bool shouldFocusActiveDescendant() const { return false; } + virtual AccessibilityObject* activeDescendant() const { return 0; } + virtual void handleActiveDescendantChanged() { } + virtual void handleAriaExpandedChanged() { } + + static AccessibilityRole ariaRoleToWebCoreRole(const String&); + const AtomicString& getAttribute(const QualifiedName&) const; + + virtual VisiblePositionRange visiblePositionRange() const { return VisiblePositionRange(); } + virtual VisiblePositionRange visiblePositionRangeForLine(unsigned) const { return VisiblePositionRange(); } + + VisiblePositionRange visiblePositionRangeForUnorderedPositions(const VisiblePosition&, const VisiblePosition&) const; + VisiblePositionRange positionOfLeftWord(const VisiblePosition&) const; + VisiblePositionRange positionOfRightWord(const VisiblePosition&) const; + VisiblePositionRange leftLineVisiblePositionRange(const VisiblePosition&) const; + VisiblePositionRange rightLineVisiblePositionRange(const VisiblePosition&) const; + VisiblePositionRange sentenceForPosition(const VisiblePosition&) const; + VisiblePositionRange paragraphForPosition(const VisiblePosition&) const; + VisiblePositionRange styleRangeForPosition(const VisiblePosition&) const; + VisiblePositionRange visiblePositionRangeForRange(const PlainTextRange&) const; + + String stringForVisiblePositionRange(const VisiblePositionRange&) const; + virtual IntRect boundsForVisiblePositionRange(const VisiblePositionRange&) const { return IntRect(); } + int lengthForVisiblePositionRange(const VisiblePositionRange&) const; + virtual void setSelectedVisiblePositionRange(const VisiblePositionRange&) const { } + + virtual VisiblePosition visiblePositionForPoint(const IntPoint&) const { return VisiblePosition(); } + VisiblePosition nextVisiblePosition(const VisiblePosition& visiblePos) const { return visiblePos.next(); } + VisiblePosition previousVisiblePosition(const VisiblePosition& visiblePos) const { return visiblePos.previous(); } + VisiblePosition nextWordEnd(const VisiblePosition&) const; + VisiblePosition previousWordStart(const VisiblePosition&) const; + VisiblePosition nextLineEndPosition(const VisiblePosition&) const; + VisiblePosition previousLineStartPosition(const VisiblePosition&) const; + VisiblePosition nextSentenceEndPosition(const VisiblePosition&) const; + VisiblePosition previousSentenceStartPosition(const VisiblePosition&) const; + VisiblePosition nextParagraphEndPosition(const VisiblePosition&) const; + VisiblePosition previousParagraphStartPosition(const VisiblePosition&) const; + virtual VisiblePosition visiblePositionForIndex(unsigned, bool /*lastIndexOK */) const { return VisiblePosition(); } + + virtual VisiblePosition visiblePositionForIndex(int) const { return VisiblePosition(); } + virtual int indexForVisiblePosition(const VisiblePosition&) const { return 0; } + + AccessibilityObject* accessibilityObjectForPosition(const VisiblePosition&) const; + int lineForPosition(const VisiblePosition&) const; + PlainTextRange plainTextRangeForVisiblePositionRange(const VisiblePositionRange&) const; + virtual int index(const VisiblePosition&) const { return -1; } + + virtual PlainTextRange doAXRangeForLine(unsigned) const { return PlainTextRange(); } + PlainTextRange doAXRangeForPosition(const IntPoint&) const; + virtual PlainTextRange doAXRangeForIndex(unsigned) const { return PlainTextRange(); } + PlainTextRange doAXStyleRangeForIndex(unsigned) const; + + virtual String doAXStringForRange(const PlainTextRange&) const { return String(); } + virtual IntRect doAXBoundsForRange(const PlainTextRange&) const { return IntRect(); } + String listMarkerTextForNodeAndPosition(Node*, const VisiblePosition&) const; + + unsigned doAXLineForIndex(unsigned); + + virtual String stringValueForMSAA() const { return String(); } + virtual String stringRoleForMSAA() const { return String(); } + virtual String nameForMSAA() const { return String(); } + virtual String descriptionForMSAA() const { return String(); } + virtual AccessibilityRole roleValueForMSAA() const { return roleValue(); } + + // Used by an ARIA tree to get all its rows. + void ariaTreeRows(AccessibilityChildrenVector&); + // Used by an ARIA tree item to get all of its direct rows that it can disclose. + void ariaTreeItemDisclosedRows(AccessibilityChildrenVector&); + // Used by an ARIA tree item to get only its content, and not its child tree items and groups. + void ariaTreeItemContent(AccessibilityChildrenVector&); + + // ARIA live-region features. + bool supportsARIALiveRegion() const; + bool isInsideARIALiveRegion() const; + virtual const AtomicString& ariaLiveRegionStatus() const { return nullAtom; } + virtual const AtomicString& ariaLiveRegionRelevant() const { return nullAtom; } + virtual bool ariaLiveRegionAtomic() const { return false; } + virtual bool ariaLiveRegionBusy() const { return false; } + + bool supportsARIAAttributes() const; + + // CSS3 Speech properties. + virtual ESpeak speakProperty() const { return SpeakNormal; } + +#if HAVE(ACCESSIBILITY) +#if PLATFORM(GTK) + AccessibilityObjectWrapper* wrapper() const; + void setWrapper(AccessibilityObjectWrapper*); +#else + AccessibilityObjectWrapper* wrapper() const { return m_wrapper.get(); } + void setWrapper(AccessibilityObjectWrapper* wrapper) + { + m_wrapper = wrapper; + } +#endif +#endif + +#if HAVE(ACCESSIBILITY) + // a platform-specific method for determining if an attachment is ignored + bool accessibilityIgnoreAttachment() const; + // gives platforms the opportunity to indicate if and how an object should be included + AccessibilityObjectInclusion accessibilityPlatformIncludesObject() const; +#else + bool accessibilityIgnoreAttachment() const { return true; } + AccessibilityObjectInclusion accessibilityPlatformIncludesObject() const { return DefaultBehavior; } +#endif + + // allows for an AccessibilityObject to update its render tree or perform + // other operations update type operations + virtual void updateBackingStore() { } + +protected: + AXID m_id; + AccessibilityChildrenVector m_children; + mutable bool m_haveChildren; + AccessibilityRole m_role; + + virtual void clearChildren(); + virtual bool isDetached() const { return true; } + +#if PLATFORM(GTK) + bool allowsTextRanges() const; + unsigned getLengthForTextRange() const; +#else + bool allowsTextRanges() const { return isTextControl(); } + unsigned getLengthForTextRange() const { return text().length(); } +#endif + +#if PLATFORM(MAC) + RetainPtr<AccessibilityObjectWrapper> m_wrapper; +#elif PLATFORM(WIN) && !OS(WINCE) + COMPtr<AccessibilityObjectWrapper> m_wrapper; +#elif PLATFORM(GTK) + AtkObject* m_wrapper; +#elif PLATFORM(CHROMIUM) + RefPtr<AccessibilityObjectWrapper> m_wrapper; +#endif +}; + +} // namespace WebCore + +#endif // AccessibilityObject_h |