| /* |
| * Copyright (C) 2008, 2009, 2011 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 AXObject_h |
| #define AXObject_h |
| |
| #include "core/InspectorTypeBuilder.h" |
| #include "core/editing/VisiblePosition.h" |
| #include "modules/ModulesExport.h" |
| #include "platform/geometry/FloatQuad.h" |
| #include "platform/geometry/LayoutRect.h" |
| #include "platform/graphics/Color.h" |
| #include "wtf/Forward.h" |
| #include "wtf/Vector.h" |
| |
| namespace blink { |
| |
| class AXObject; |
| class AXObjectCache; |
| class AXObjectCacheImpl; |
| class Element; |
| class FrameView; |
| class IntPoint; |
| class NameSource; |
| class Node; |
| class LayoutObject; |
| class ScrollableArea; |
| class Widget; |
| |
| typedef unsigned AXID; |
| |
| enum AccessibilityRole { |
| UnknownRole = 0, |
| AlertDialogRole, |
| AlertRole, |
| AnnotationRole, // No mapping to ARIA role |
| ApplicationRole, |
| ArticleRole, |
| BannerRole, |
| BlockquoteRole, // No mapping to ARIA role |
| BusyIndicatorRole, // No mapping to ARIA role |
| ButtonRole, |
| CanvasRole, // No mapping to ARIA role |
| CaptionRole, // No mapping to ARIA role |
| CellRole, |
| CheckBoxRole, |
| ColorWellRole, // No mapping to ARIA role |
| ColumnHeaderRole, |
| ColumnRole, // No mapping to ARIA role |
| ComboBoxRole, |
| ComplementaryRole, |
| ContentInfoRole, |
| DateRole, // No mapping to ARIA role |
| DateTimeRole, // No mapping to ARIA role |
| DefinitionRole, |
| DescriptionListDetailRole, // No mapping to ARIA role |
| DescriptionListRole, // No mapping to ARIA role |
| DescriptionListTermRole, // No mapping to ARIA role |
| DetailsRole, // No mapping to ARIA role |
| DialogRole, |
| DirectoryRole, |
| DisclosureTriangleRole, // No mapping to ARIA role |
| DivRole, // No mapping to ARIA role |
| DocumentRole, |
| EmbeddedObjectRole, // No mapping to ARIA role |
| FigcaptionRole, // No mapping to ARIA role |
| FigureRole, // No mapping to ARIA role |
| FooterRole, |
| FormRole, |
| GridRole, |
| GroupRole, |
| HeadingRole, |
| IframePresentationalRole, // No mapping to ARIA role |
| IframeRole, // No mapping to ARIA role |
| IgnoredRole, // No mapping to ARIA role |
| ImageMapLinkRole, // No mapping to ARIA role |
| ImageMapRole, // No mapping to ARIA role |
| ImageRole, |
| InlineTextBoxRole, // No mapping to ARIA role |
| InputTimeRole, // No mapping to ARIA role |
| LabelRole, |
| LegendRole, // No mapping to ARIA role |
| LinkRole, |
| ListBoxOptionRole, |
| ListBoxRole, |
| ListItemRole, |
| ListMarkerRole, // No mapping to ARIA role |
| ListRole, |
| LogRole, |
| MainRole, |
| MarkRole, // No mapping to ARIA role |
| MarqueeRole, |
| MathRole, |
| MenuBarRole, |
| MenuButtonRole, |
| MenuItemRole, |
| MenuItemCheckBoxRole, |
| MenuItemRadioRole, |
| MenuListOptionRole, |
| MenuListPopupRole, |
| MenuRole, |
| MeterRole, |
| NavigationRole, |
| NoneRole, // No mapping to ARIA role |
| NoteRole, |
| OutlineRole, // No mapping to ARIA role |
| ParagraphRole, // No mapping to ARIA role |
| PopUpButtonRole, |
| PreRole, // No mapping to ARIA role |
| PresentationalRole, |
| ProgressIndicatorRole, |
| RadioButtonRole, |
| RadioGroupRole, |
| RegionRole, |
| RootWebAreaRole, // No mapping to ARIA role |
| RowHeaderRole, |
| RowRole, |
| RubyRole, // No mapping to ARIA role |
| RulerRole, // No mapping to ARIA role |
| SVGRootRole, // No mapping to ARIA role |
| ScrollAreaRole, // No mapping to ARIA role |
| ScrollBarRole, |
| SeamlessWebAreaRole, // No mapping to ARIA role |
| SearchRole, |
| SearchBoxRole, |
| SliderRole, |
| SliderThumbRole, // No mapping to ARIA role |
| SpinButtonPartRole, // No mapping to ARIA role |
| SpinButtonRole, |
| SplitterRole, |
| StaticTextRole, // No mapping to ARIA role |
| StatusRole, |
| SwitchRole, |
| TabGroupRole, // No mapping to ARIA role |
| TabListRole, |
| TabPanelRole, |
| TabRole, |
| TableHeaderContainerRole, // No mapping to ARIA role |
| TableRole, |
| TextFieldRole, |
| TimeRole, // No mapping to ARIA role |
| TimerRole, |
| ToggleButtonRole, |
| ToolbarRole, |
| TreeGridRole, |
| TreeItemRole, |
| TreeRole, |
| UserInterfaceTooltipRole, |
| WebAreaRole, // No mapping to ARIA role |
| LineBreakRole, // No mapping to ARIA role |
| WindowRole, // No mapping to ARIA role |
| NumRoles |
| }; |
| |
| enum AccessibilityTextSource { |
| AlternativeText, |
| ChildrenText, |
| SummaryText, |
| HelpText, |
| VisibleText, |
| TitleTagText, |
| PlaceholderText, |
| LabelByElementText, |
| }; |
| |
| enum AccessibilityState { |
| AXBusyState, |
| AXCheckedState, |
| AXEnabledState, |
| AXExpandedState, |
| AXFocusableState, |
| AXFocusedState, |
| AXHaspopupState, |
| AXHoveredState, |
| AXIndeterminateState, |
| AXInvisibleState, |
| AXLinkedState, |
| AXMultilineState, |
| AXMultiselectableState, |
| AXOffscreenState, |
| AXPressedState, |
| AXProtectedState, |
| AXReadonlyState, |
| AXRequiredState, |
| AXSelectableState, |
| AXSelectedState, |
| AXVerticalState, |
| AXVisitedState |
| }; |
| |
| class AccessibilityText final : public GarbageCollectedFinalized<AccessibilityText> { |
| public: |
| static AccessibilityText* create(const String& text, const AccessibilityTextSource& source) |
| { |
| return new AccessibilityText(text, source, nullptr); |
| } |
| static AccessibilityText* create(const String& text, const AccessibilityTextSource& source, AXObject* element) |
| { |
| return new AccessibilityText(text, source, element); |
| } |
| |
| String text() const { return m_text; } |
| AccessibilityTextSource textSource() const { return m_textSource; } |
| AXObject* textElement() const { return m_textElement; } |
| |
| DEFINE_INLINE_TRACE() |
| { |
| visitor->trace(m_textElement); |
| } |
| |
| private: |
| AccessibilityText(const String& text, const AccessibilityTextSource& source, AXObject* element) |
| : m_text(text) |
| , m_textSource(source) |
| , m_textElement(element) |
| { } |
| |
| String m_text; |
| AccessibilityTextSource m_textSource; |
| Member<AXObject> m_textElement; |
| }; |
| |
| enum AccessibilityOrientation { |
| AccessibilityOrientationUndefined = 0, |
| AccessibilityOrientationVertical, |
| AccessibilityOrientationHorizontal, |
| }; |
| |
| enum AXObjectInclusion { |
| IncludeObject, |
| IgnoreObject, |
| DefaultBehavior, |
| }; |
| |
| enum AccessibilityButtonState { |
| ButtonStateOff = 0, |
| ButtonStateOn, |
| ButtonStateMixed, |
| }; |
| |
| enum AccessibilityTextDirection { |
| AccessibilityTextDirectionLTR, |
| AccessibilityTextDirectionRTL, |
| AccessibilityTextDirectionTTB, |
| AccessibilityTextDirectionBTT |
| }; |
| |
| enum SortDirection { |
| SortDirectionUndefined = 0, |
| SortDirectionNone, |
| SortDirectionAscending, |
| SortDirectionDescending, |
| SortDirectionOther |
| }; |
| |
| enum AccessibilityExpanded { |
| ExpandedUndefined = 0, |
| ExpandedCollapsed, |
| ExpandedExpanded, |
| }; |
| |
| enum AccessibilityOptionalBool { |
| OptionalBoolUndefined = 0, |
| OptionalBoolTrue, |
| OptionalBoolFalse |
| }; |
| |
| enum InvalidState { |
| InvalidStateUndefined = 0, |
| InvalidStateFalse, |
| InvalidStateTrue, |
| InvalidStateSpelling, |
| InvalidStateGrammar, |
| InvalidStateOther |
| }; |
| |
| enum TextStyle { |
| TextStyleNone = 0, |
| TextStyleBold = 1 << 0, |
| TextStyleItalic = 1 << 1, |
| TextStyleUnderline = 1 << 2, |
| TextStyleLineThrough = 1 << 3 |
| }; |
| |
| enum TextUnderElementMode { |
| TextUnderElementAll, |
| TextUnderElementAny // If the text is unimportant, just whether or not it's present |
| }; |
| |
| // The source of the accessible name of an element. This is needed |
| // because on some platforms this determines how the accessible name |
| // is exposed. |
| enum AXNameFrom { |
| AXNameFromUninitialized = -1, |
| AXNameFromAttribute = 0, |
| AXNameFromContents, |
| AXNameFromPlaceholder, |
| AXNameFromRelatedElement, |
| }; |
| |
| // The potential native HTML-based text (name, description or placeholder) sources for an element. |
| // See http://rawgit.com/w3c/aria/master/html-aam/html-aam.html#accessible-name-and-description-calculation |
| enum AXTextFromNativeHTML { |
| AXTextFromNativeHTMLUninitialized = -1, |
| AXTextFromNativeHTMLFigcaption, |
| AXTextFromNativeHTMLLabel, |
| AXTextFromNativeHTMLLabelFor, |
| AXTextFromNativeHTMLLabelWrapped, |
| AXTextFromNativeHTMLTableCaption, |
| }; |
| |
| // The source of the accessible description of an element. This is needed |
| // because on some platforms this determines how the accessible description |
| // is exposed. |
| enum AXDescriptionFrom { |
| AXDescriptionFromPlaceholder, |
| AXDescriptionFromRelatedElement |
| }; |
| |
| enum AXIgnoredReason { |
| AXActiveModalDialog, |
| AXAncestorDisallowsChild, |
| AXAncestorIsLeafNode, |
| AXAriaHidden, |
| AXAriaHiddenRoot, |
| AXEmptyAlt, |
| AXEmptyText, |
| AXInert, |
| AXInheritsPresentation, |
| AXLabelContainer, |
| AXLabelFor, |
| AXNotRendered, |
| AXNotVisible, |
| AXPresentationalRole, |
| AXProbablyPresentational, |
| AXStaticTextUsedAsNameFor, |
| AXUninteresting |
| }; |
| |
| class IgnoredReason { |
| ALLOW_ONLY_INLINE_ALLOCATION(); |
| public: |
| AXIgnoredReason reason; |
| Member<const AXObject> relatedObject; |
| |
| explicit IgnoredReason(AXIgnoredReason reason) |
| : reason(reason) |
| , relatedObject(nullptr) |
| { } |
| |
| IgnoredReason(AXIgnoredReason r, const AXObject* obj) |
| : reason(r) |
| , relatedObject(obj) |
| { } |
| |
| DEFINE_INLINE_TRACE() |
| { |
| visitor->trace(relatedObject); |
| } |
| }; |
| |
| typedef HeapVector<Member<AXObject>> AXObjectVector; |
| class NameSource { |
| ALLOW_ONLY_INLINE_ALLOCATION(); |
| public: |
| String text; |
| bool superseded = false; |
| bool invalid = false; |
| AXNameFrom type = AXNameFromUninitialized; |
| const QualifiedName& attribute; |
| AtomicString attributeValue; |
| AXTextFromNativeHTML nativeSource = AXTextFromNativeHTMLUninitialized; |
| AXObjectVector nameObjects; |
| |
| explicit NameSource(bool superseded, const QualifiedName& attr) |
| : superseded(superseded) |
| , attribute(attr) |
| { |
| } |
| |
| explicit NameSource(bool superseded) |
| : superseded(superseded) |
| , attribute(QualifiedName::null()) |
| { |
| } |
| |
| DEFINE_INLINE_TRACE() |
| { |
| visitor->trace(nameObjects); |
| } |
| }; |
| |
| class MODULES_EXPORT AXObject : public GarbageCollectedFinalized<AXObject> { |
| public: |
| typedef HeapVector<Member<AXObject>> AccessibilityChildrenVector; |
| |
| struct AXRange { |
| ALLOW_ONLY_INLINE_ALLOCATION(); |
| // The deepest descendant in which the range starts. |
| // (nullptr means the current object.) |
| Persistent<AXObject> anchorObject; |
| // The number of characters and child objects in the anchor object |
| // before the range starts. |
| int anchorOffset; |
| // The deepest descendant in which the range ends. |
| // (nullptr means the current object.) |
| Persistent<AXObject> focusObject; |
| // The number of characters and child objects in the focus object |
| // before the range ends. |
| int focusOffset; |
| |
| AXRange() |
| : anchorObject(nullptr) |
| , anchorOffset(-1) |
| , focusObject(nullptr) |
| , focusOffset(-1) |
| { } |
| |
| AXRange(int startOffset, int endOffset) |
| : anchorObject(nullptr) |
| , anchorOffset(startOffset) |
| , focusObject(nullptr) |
| , focusOffset(endOffset) |
| { } |
| |
| AXRange(AXObject* anchorObject, int anchorOffset, |
| AXObject* focusObject, int focusOffset) |
| : anchorObject(anchorObject) |
| , anchorOffset(anchorOffset) |
| , focusObject(focusObject) |
| , focusOffset(focusOffset) |
| { } |
| |
| bool isValid() const |
| { |
| return ((anchorObject && focusObject) |
| || (!anchorObject && !focusObject)) |
| && anchorOffset >= 0 && focusOffset >= 0; |
| } |
| |
| // Determines if the range only refers to text offsets under the current object. |
| bool isSimple() const |
| { |
| return anchorObject == focusObject || !anchorObject || !focusObject; |
| } |
| }; |
| |
| protected: |
| AXObject(AXObjectCacheImpl&); |
| |
| public: |
| virtual ~AXObject(); |
| DECLARE_VIRTUAL_TRACE(); |
| |
| static unsigned numberOfLiveAXObjects() { return s_numberOfLiveAXObjects; } |
| |
| // After constructing an AXObject, it must be given a |
| // unique ID, then added to AXObjectCacheImpl, and finally init() must |
| // be called last. |
| void setAXObjectID(AXID axObjectID) { m_id = axObjectID; } |
| virtual void init() { } |
| |
| // When the corresponding WebCore object that this AXObject |
| // wraps is deleted, it must be detached. |
| virtual void detach(); |
| virtual bool isDetached() const; |
| |
| // If the parent of this object is known, this can be faster than using computeParent(). |
| virtual void setParent(AXObject* parent) { m_parent = parent; } |
| |
| // The AXObjectCacheImpl that owns this object, and its unique ID within this cache. |
| AXObjectCacheImpl& axObjectCache() const |
| { |
| ASSERT(m_axObjectCache); |
| return *m_axObjectCache; |
| } |
| |
| AXID axObjectID() const { return m_id; } |
| |
| // Determine subclass type. |
| virtual bool isAXNodeObject() const { return false; } |
| virtual bool isAXLayoutObject() const { return false; } |
| virtual bool isAXListBox() const { return false; } |
| virtual bool isAXListBoxOption() const { return false; } |
| virtual bool isAXScrollbar() const { return false; } |
| virtual bool isAXScrollView() const { return false; } |
| virtual bool isAXSVGRoot() const { return false; } |
| |
| // Check object role or purpose. |
| virtual AccessibilityRole roleValue() const { return m_role; } |
| bool isARIATextControl() const; |
| virtual bool isARIATreeGridRow() const { return false; } |
| virtual bool isAXTable() const { return false; } |
| virtual bool isAnchor() const { return false; } |
| virtual bool isAttachment() const { return false; } |
| bool isButton() const; |
| bool isCanvas() const { return roleValue() == CanvasRole; } |
| bool isCheckbox() const { return roleValue() == CheckBoxRole; } |
| bool isCheckboxOrRadio() const { return isCheckbox() || isRadioButton(); } |
| bool isColorWell() const { return roleValue() == ColorWellRole; } |
| bool isComboBox() const { return roleValue() == ComboBoxRole; } |
| virtual bool isControl() const { return false; } |
| virtual bool isDataTable() const { return false; } |
| virtual bool isEmbeddedObject() const { return false; } |
| virtual bool isFieldset() const { return false; } |
| virtual bool isHeading() const { return false; } |
| virtual bool isImage() const { return false; } |
| virtual bool isImageMapLink() const { return false; } |
| virtual bool isInputImage() const { return false; } |
| bool isLandmarkRelated() const; |
| virtual bool isLink() const { return false; } |
| virtual bool isList() const { return false; } |
| bool isListItem() const { return roleValue() == ListItemRole; } |
| virtual bool isMenu() const { return false; } |
| virtual bool isMenuButton() const { return false; } |
| virtual bool isMenuList() const { return false; } |
| virtual bool isMenuListOption() const { return false; } |
| virtual bool isMenuListPopup() const { return false; } |
| bool isMenuRelated() const; |
| virtual bool isMeter() const { return false; } |
| virtual bool isMockObject() const { return false; } |
| virtual bool isNativeSpinButton() const { return false; } |
| virtual bool isNativeTextControl() const { return false; } // input or textarea |
| virtual bool isNonNativeTextControl() const { return false; } // contenteditable or role=textbox |
| virtual bool isPasswordField() const { return false; } |
| virtual bool isPasswordFieldAndShouldHideValue() const; |
| bool isPresentational() const { return roleValue() == NoneRole || roleValue() == PresentationalRole; } |
| virtual bool isProgressIndicator() const { return false; } |
| bool isRadioButton() const { return roleValue() == RadioButtonRole; } |
| bool isRange() const { return roleValue() == ProgressIndicatorRole || roleValue() == ScrollBarRole || roleValue() == SliderRole || roleValue() == SpinButtonRole; } |
| bool isScrollbar() const { return roleValue() == ScrollBarRole; } |
| virtual bool isSlider() const { return false; } |
| virtual bool isNativeSlider() const { return false; } |
| virtual bool isSpinButton() const { return roleValue() == SpinButtonRole; } |
| virtual bool isSpinButtonPart() const { return false; } |
| bool isTabItem() const { return roleValue() == TabRole; } |
| virtual bool isTableCell() const { return false; } |
| virtual bool isTableRow() const { return false; } |
| virtual bool isTextControl() const { return false; } |
| virtual bool isTableCol() const { return false; } |
| bool isTree() const { return roleValue() == TreeRole; } |
| bool isTreeItem() const { return roleValue() == TreeItemRole; } |
| bool isWebArea() const { return roleValue() == WebAreaRole; } |
| |
| // Check object state. |
| virtual bool isChecked() const { return false; } |
| virtual bool isClickable() const; |
| virtual bool isCollapsed() const { return false; } |
| virtual bool isEnabled() const { return false; } |
| virtual AccessibilityExpanded isExpanded() const { return ExpandedUndefined; } |
| virtual bool isFocused() const { return false; } |
| virtual bool isHovered() const { return false; } |
| virtual bool isIndeterminate() const { return false; } |
| virtual bool isLinked() 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 isRequired() const { return false; } |
| virtual bool isSelected() const { return false; } |
| virtual bool isSelectedOptionActive() const { return false; } |
| virtual bool isVisible() const { return true; } |
| virtual bool isVisited() const { return false; } |
| |
| // Check whether certain properties can be modified. |
| virtual bool canSetFocusAttribute() const { return false; } |
| virtual bool canSetValueAttribute() const { return false; } |
| virtual bool canSetSelectedAttribute() const { return false; } |
| |
| // Whether objects are ignored, i.e. not included in the tree. |
| bool accessibilityIsIgnored() const; |
| typedef HeapVector<IgnoredReason> IgnoredReasons; |
| virtual bool computeAccessibilityIsIgnored(IgnoredReasons* = nullptr) const { return true; } |
| bool accessibilityIsIgnoredByDefault(IgnoredReasons* = nullptr) const; |
| AXObjectInclusion accessibilityPlatformIncludesObject() const; |
| virtual AXObjectInclusion defaultObjectInclusion(IgnoredReasons* = nullptr) const; |
| bool isInertOrAriaHidden() const; |
| const AXObject* ariaHiddenRoot() const; |
| bool computeIsInertOrAriaHidden(IgnoredReasons* = nullptr) const; |
| bool isDescendantOfLeafNode() const; |
| AXObject* leafNodeAncestor() const; |
| bool isDescendantOfDisabledNode() const; |
| const AXObject* disabledAncestor() const; |
| bool lastKnownIsIgnoredValue(); |
| void setLastKnownIsIgnoredValue(bool); |
| bool hasInheritedPresentationalRole() const; |
| bool isPresentationalChild() const; |
| |
| // |
| // Deprecated text alternative calculation API. All of these will be replaced |
| // with the new API, below (under "New text alternative calculation API". |
| // |
| |
| virtual bool deprecatedExposesTitleUIElement() const { return true; } |
| virtual AXObject* deprecatedTitleUIElement() const { return 0; } |
| virtual String deprecatedPlaceholder() const { return String(); } |
| virtual void deprecatedAriaDescribedbyElements(AccessibilityChildrenVector& describedby) const { } |
| virtual void deprecatedAriaLabelledbyElements(AccessibilityChildrenVector& labelledby) const { } |
| virtual String deprecatedAccessibilityDescription() const { return String(); } |
| virtual String deprecatedTitle(TextUnderElementMode mode = TextUnderElementAll) const { return String(); } |
| virtual String deprecatedHelpText() const { return String(); } |
| virtual String deprecatedTextUnderElement(TextUnderElementMode mode = TextUnderElementAll) const { return String(); } |
| |
| // |
| // New text alternative calculation API (under development). |
| // |
| |
| // Retrieves the accessible name of the object, an enum indicating where the name |
| // was derived from, and a list of objects that were used to derive the name, if any. |
| virtual String name(AXNameFrom&, AXObjectVector* nameObjects) const; |
| |
| typedef HeapVector<NameSource> NameSources; |
| // Retrieves the accessible name of the object and a list of all potential sources |
| // for the name, indicating which were used. |
| virtual String name(NameSources*) const; |
| |
| // Takes the result of nameFrom from calling |name|, above, and retrieves the |
| // accessible description of the object, which is secondary to |name|, an enum indicating |
| // where the description was derived from, and a list of objects that were used to |
| // derive the description, if any. |
| virtual String description(AXNameFrom, AXDescriptionFrom&, AXObjectVector* descriptionObjects) { return String(); } |
| |
| // Takes the result of nameFrom and descriptionFrom from calling |name| and |description|, |
| // above, and retrieves the placeholder of the object, if present and if it wasn't already |
| // exposed by one of the two functions above. |
| virtual String placeholder(AXNameFrom, AXDescriptionFrom) { return String(); } |
| |
| // Internal function used by name and description, above. |
| typedef HeapHashSet<Member<const AXObject>> AXObjectSet; |
| virtual String textAlternative(bool recursive, bool inAriaLabelledByTraversal, AXObjectSet& visited, AXNameFrom& nameFrom, AXObjectVector* nameObjects, NameSources* nameSources) const { return String(); } |
| |
| // Returns result of Accessible Name Calculation algorithm. |
| // This is a simpler high-level interface to |name| used by Inspector. |
| virtual String computedName() const { return String(); } |
| |
| // |
| // Properties of static elements. |
| // |
| |
| virtual const AtomicString& accessKey() const { return nullAtom; } |
| virtual RGBA32 backgroundColor() const { return Color::transparent; } |
| virtual RGBA32 color() const { return Color::black; } |
| // Used by objects of role ColorWellRole. |
| virtual RGBA32 colorValue() const { return Color::transparent; } |
| virtual bool canvasHasFallbackContent() const { return false; } |
| // Font size is in pixels. |
| virtual float fontSize() const { return 0.0f; } |
| virtual int headingLevel() const { return 0; } |
| // 1-based, to match the aria-level spec. |
| virtual unsigned hierarchicalLevel() const { return 0; } |
| virtual AccessibilityOrientation orientation() const; |
| virtual String text() const { return String(); } |
| virtual AccessibilityTextDirection textDirection() const { return AccessibilityTextDirectionLTR; } |
| virtual int textLength() const { return 0; } |
| virtual TextStyle textStyle() const { return TextStyleNone; } |
| virtual KURL url() const { return KURL(); } |
| |
| // Load inline text boxes for just this node, even if |
| // settings->inlineTextBoxAccessibilityEnabled() is false. |
| virtual void loadInlineTextBoxes() { } |
| |
| // Walk the AXObjects on the same line. This is supported on any |
| // object type but primarily intended to be used for inline text boxes. |
| virtual AXObject* nextOnLine() const { return nullptr; } |
| virtual AXObject* previousOnLine() const { return nullptr; } |
| |
| // For an inline text box. |
| // The integer horizontal pixel offset of each character in the string; negative values for RTL. |
| virtual void textCharacterOffsets(Vector<int>&) const { } |
| // The start and end character offset of each word in the inline text box. |
| virtual void wordBoundaries(Vector<AXRange>& words) const { } |
| |
| // Properties of interactive elements. |
| virtual String actionVerb() const; |
| virtual AccessibilityButtonState checkboxOrRadioValue() const; |
| virtual InvalidState invalidState() const { return InvalidStateUndefined; } |
| // Only used when invalidState() returns InvalidStateOther. |
| virtual String ariaInvalidValue() const { return String(); } |
| 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 String stringValue() const { return String(); } |
| |
| // ARIA attributes. |
| virtual AXObject* activeDescendant() const { return 0; } |
| virtual String ariaAutoComplete() const { return String(); } |
| virtual String ariaDescribedByAttribute() const { return String(); } |
| virtual void ariaFlowToElements(AccessibilityChildrenVector&) const { } |
| virtual void ariaControlsElements(AccessibilityChildrenVector&) const { } |
| virtual void ariaOwnsElements(AccessibilityChildrenVector& owns) const { } |
| virtual bool ariaHasPopup() const { return false; } |
| virtual bool isEditable() const { return false; } |
| bool isMultiline() const; |
| virtual bool isRichlyEditable() const { return false; } |
| virtual String ariaLabelledbyAttribute() const { return String(); } |
| bool ariaPressedIsPresent() const; |
| virtual AccessibilityRole ariaRoleAttribute() const { return UnknownRole; } |
| virtual bool ariaRoleHasPresentationalChildren() const { return false; } |
| virtual AXObject* ancestorForWhichThisIsAPresentationalChild() const { return 0; } |
| virtual bool shouldFocusActiveDescendant() const { return false; } |
| bool supportsARIAAttributes() const; |
| virtual bool supportsARIADragging() const { return false; } |
| virtual bool supportsARIADropping() const { return false; } |
| virtual bool supportsARIAFlowTo() const { return false; } |
| virtual bool supportsARIAOwns() const { return false; } |
| bool supportsRangeValue() const; |
| virtual SortDirection sortDirection() const { return SortDirectionUndefined; } |
| |
| // Returns 0-based index. |
| int indexInParent() const; |
| |
| // Returns 1-based position in set. |
| virtual int posInSet() const { return 0; } |
| virtual int setSize() const { return 0; } |
| bool supportsSetSizeAndPosInSet() const; |
| |
| // ARIA trees. |
| // Used by an ARIA tree to get all its rows. |
| void ariaTreeRows(AccessibilityChildrenVector&); |
| |
| // ARIA live-region features. |
| bool isLiveRegion() const; |
| const AXObject* liveRegionRoot() const; |
| virtual const AtomicString& liveRegionStatus() const { return nullAtom; } |
| virtual const AtomicString& liveRegionRelevant() const { return nullAtom; } |
| virtual bool liveRegionAtomic() const { return false; } |
| virtual bool liveRegionBusy() const { return false; } |
| |
| const AtomicString& containerLiveRegionStatus() const; |
| const AtomicString& containerLiveRegionRelevant() const; |
| bool containerLiveRegionAtomic() const; |
| bool containerLiveRegionBusy() const; |
| |
| // Location and click point in frame-relative coordinates. |
| virtual LayoutRect elementRect() const { return m_explicitElementRect; } |
| void setElementRect(LayoutRect r) { m_explicitElementRect = r; } |
| virtual void markCachedElementRectDirty() const; |
| virtual IntPoint clickPoint(); |
| |
| // Hit testing. |
| // Called on the root AX object to return the deepest available element. |
| virtual AXObject* accessibilityHitTest(const IntPoint&) const { return 0; } |
| // Called on the AX object after the layout tree determines which is the right AXLayoutObject. |
| virtual AXObject* elementAccessibilityHitTest(const IntPoint&) const; |
| |
| // High-level accessibility tree access. Other modules should only use these functions. |
| const AccessibilityChildrenVector& children(); |
| AXObject* parentObject() const; |
| AXObject* parentObjectIfExists() const; |
| virtual AXObject* computeParent() const = 0; |
| virtual AXObject* computeParentIfExists() const { return 0; } |
| AXObject* cachedParentObject() const { return m_parent; } |
| AXObject* parentObjectUnignored() const; |
| |
| // Low-level accessibility tree exploration, only for use within the accessibility module. |
| virtual AXObject* firstChild() const { return 0; } |
| virtual AXObject* nextSibling() const { return 0; } |
| AXObject* firstAccessibleObjectFromNode(const Node*); |
| virtual void addChildren() { } |
| virtual bool canHaveChildren() const { return true; } |
| bool hasChildren() const { return m_haveChildren; } |
| virtual void updateChildrenIfNecessary(); |
| virtual bool needsToUpdateChildren() const { return false; } |
| virtual void setNeedsToUpdateChildren() { } |
| virtual void clearChildren(); |
| virtual void detachFromParent() { m_parent = 0; } |
| virtual AXObject* scrollBar(AccessibilityOrientation) { return 0; } |
| |
| // Properties of the object's owning document or page. |
| virtual double estimatedLoadingProgress() const { return 0; } |
| AXObject* focusedUIElement() const; |
| |
| // DOM and layout tree access. |
| virtual Node* node() const { return 0; } |
| virtual LayoutObject* layoutObject() const { return 0; } |
| virtual Document* document() const; |
| virtual FrameView* documentFrameView() const; |
| virtual Element* anchorElement() const { return 0; } |
| virtual Element* actionElement() const { return 0; } |
| virtual Widget* widgetForAttachmentView() const { return 0; } |
| String language() const; |
| bool hasAttribute(const QualifiedName&) const; |
| const AtomicString& getAttribute(const QualifiedName&) const; |
| |
| // Methods that retrieve or manipulate the current selection. |
| |
| // Get the current selection from anywhere in the accessibility tree. |
| virtual AXRange selection() const { return AXRange(); } |
| // Gets only the start and end offsets of the selection computed using the |
| // current object as the starting point. Returns a null selection if there is |
| // no selection in the subtree rooted at this object. |
| virtual AXRange selectionUnderObject() const { return AXRange(); } |
| virtual void setSelection(const AXRange&) { } |
| |
| // Scrollable containers. |
| bool isScrollableContainer() const; |
| IntPoint scrollOffset() const; |
| IntPoint minimumScrollOffset() const; |
| IntPoint maximumScrollOffset() const; |
| void setScrollOffset(const IntPoint&) const; |
| |
| // If this object itself scrolls, return its ScrollableArea. |
| virtual ScrollableArea* getScrollableAreaIfScrollable() const { return 0; } |
| |
| // Modify or take an action on an object. |
| virtual void increment() { } |
| virtual void decrement() { } |
| bool performDefaultAction() const { return press(); } |
| virtual bool press() const; |
| // Make this object visible by scrolling as many nested scrollable views as needed. |
| void scrollToMakeVisible() const; |
| // Same, but if the whole object can't be made visible, try for this subrect, in local coordinates. |
| void scrollToMakeVisibleWithSubFocus(const IntRect&) const; |
| // Scroll this object to a given point in global coordinates of the top-level window. |
| void scrollToGlobalPoint(const IntPoint&) const; |
| virtual void setFocused(bool) { } |
| virtual void setSelected(bool) { } |
| void setSelectedText(const String&) { } |
| virtual void setValue(const String&) { } |
| virtual void setValue(float) { } |
| |
| // Notifications that this object may have changed. |
| virtual void childrenChanged() { } |
| virtual void handleActiveDescendantChanged() { } |
| virtual void handleAriaExpandedChanged() { } |
| void notifyIfIgnoredValueChanged(); |
| virtual void selectionChanged(); |
| virtual void textChanged() { } |
| virtual void updateAccessibilityRole() { } |
| |
| // Text metrics. Most of these should be deprecated, needs major cleanup. |
| virtual VisiblePosition visiblePositionForIndex(int) const { return VisiblePosition(); } |
| int lineForPosition(const VisiblePosition&) const; |
| virtual int index(const VisiblePosition&) const { return -1; } |
| virtual void lineBreaks(Vector<int>&) const { } |
| |
| // Static helper functions. |
| static bool isARIAControl(AccessibilityRole); |
| static bool isARIAInput(AccessibilityRole); |
| static AccessibilityRole ariaRoleToWebCoreRole(const String&); |
| static IntRect boundingBoxForQuads(LayoutObject*, const Vector<FloatQuad>&); |
| static const AtomicString& roleName(AccessibilityRole); |
| static const AtomicString& internalRoleName(AccessibilityRole); |
| static bool isInsideFocusableElementOrARIAWidget(const Node&); |
| |
| protected: |
| AXID m_id; |
| AccessibilityChildrenVector m_children; |
| mutable bool m_haveChildren; |
| AccessibilityRole m_role; |
| AXObjectInclusion m_lastKnownIsIgnoredValue; |
| LayoutRect m_explicitElementRect; |
| |
| // Used only in recursive calls from textAlternative() |
| static String recursiveTextAlternative(const AXObject&, bool inAriaLabelledByTraversal, AXObjectSet& visited); |
| |
| virtual const AXObject* inheritsPresentationalRoleFrom() const { return 0; } |
| |
| bool nameFromContents() const; |
| |
| AccessibilityRole buttonRoleType() const; |
| |
| unsigned getLengthForTextRange() const { return text().length(); } |
| |
| bool m_detached; |
| |
| mutable Member<AXObject> m_parent; |
| |
| // The following cached attribute values (the ones starting with m_cached*) |
| // are only valid if m_lastModificationCount matches AXObjectCacheImpl::modificationCount(). |
| mutable int m_lastModificationCount; |
| mutable bool m_cachedIsIgnored : 1; |
| mutable bool m_cachedIsInertOrAriaHidden : 1; |
| mutable bool m_cachedIsDescendantOfLeafNode : 1; |
| mutable bool m_cachedIsDescendantOfDisabledNode : 1; |
| mutable bool m_cachedHasInheritedPresentationalRole : 1; |
| mutable bool m_cachedIsPresentationalChild : 1; |
| mutable Member<const AXObject> m_cachedLiveRegionRoot; |
| |
| Member<AXObjectCacheImpl> m_axObjectCache; |
| |
| // Updates the cached attribute values. This may be recursive, so to prevent deadlocks, |
| // functions called here may only search up the tree (ancestors), not down. |
| void updateCachedAttributeValuesIfNeeded() const; |
| |
| private: |
| static bool includesARIAWidgetRole(const String&); |
| static bool hasInteractiveARIAAttribute(const Element&); |
| |
| static unsigned s_numberOfLiveAXObjects; |
| }; |
| |
| #define DEFINE_AX_OBJECT_TYPE_CASTS(thisType, predicate) \ |
| DEFINE_TYPE_CASTS(thisType, AXObject, object, object->predicate, object.predicate) |
| |
| } // namespace blink |
| |
| WTF_ALLOW_INIT_WITH_MEM_FUNCTIONS(blink::IgnoredReason); |
| WTF_ALLOW_INIT_WITH_MEM_FUNCTIONS(blink::NameSource); |
| |
| #endif // AXObject_h |