| /* |
| * 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 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. |
| */ |
| |
| #pragma once |
| |
| #include "AccessibilityObjectInterface.h" |
| #include "FloatQuad.h" |
| #include "LayoutRect.h" |
| #include "Path.h" |
| #include <wtf/Forward.h> |
| #include <wtf/Function.h> |
| #include <wtf/RefPtr.h> |
| #include <wtf/Vector.h> |
| |
| #if PLATFORM(COCOA) |
| #include <wtf/RetainPtr.h> |
| #endif |
| |
| #if PLATFORM(COCOA) |
| |
| OBJC_CLASS NSArray; |
| OBJC_CLASS NSAttributedString; |
| OBJC_CLASS NSData; |
| OBJC_CLASS NSMutableAttributedString; |
| OBJC_CLASS NSString; |
| OBJC_CLASS NSValue; |
| OBJC_CLASS NSView; |
| |
| #endif |
| |
| namespace WebCore { |
| |
| class AccessibilityObject; |
| class IntPoint; |
| class IntSize; |
| class ScrollableArea; |
| |
| struct AccessibilityText { |
| String text; |
| AccessibilityTextSource textSource; |
| |
| AccessibilityText(const String& t, const AccessibilityTextSource& s) |
| : text(t) |
| , textSource(s) |
| { } |
| }; |
| |
| bool nodeHasPresentationRole(Node*); |
| |
| class AccessibilityObject : public AXCoreObject { |
| public: |
| virtual ~AccessibilityObject(); |
| |
| // After constructing an AccessibilityObject, it must be given a |
| // unique ID, then added to AXObjectCache, and finally init() must |
| // be called last. |
| void setObjectID(AXID id) override { m_id = id; } |
| void init() override { } |
| |
| // Prefer using the dedicated functions over consuming these flag values directly, as the flags can sometimes be uninitialized. |
| // Also, the dedicated functions traverse for you if the flags aren't yet initialized. |
| // For example, use `hasDocumentRoleAncestor()` instead of `ancestorFlags().contains(AXAncestorFlag::HasDocumentRoleAncestor)`. |
| OptionSet<AXAncestorFlag> ancestorFlags() const { return m_ancestorFlags; } |
| |
| void addAncestorFlags(const OptionSet<AXAncestorFlag>& flags) { m_ancestorFlags.add(flags); } |
| bool ancestorFlagsAreInitialized() const { return m_ancestorFlags.contains(AXAncestorFlag::FlagsInitialized); } |
| // Computes the flags that this object matches (no traversal is done). |
| OptionSet<AXAncestorFlag> computeAncestorFlags() const; |
| // Computes the flags that this object and all ancestors match, traversing all the way to the root. |
| OptionSet<AXAncestorFlag> computeAncestorFlagsWithTraversal() const; |
| void initializeAncestorFlags(const OptionSet<AXAncestorFlag>&); |
| bool hasAncestorMatchingFlag(AXAncestorFlag) const; |
| bool matchesAncestorFlag(AXAncestorFlag) const; |
| |
| bool hasDocumentRoleAncestor() const override; |
| bool hasWebApplicationAncestor() const override; |
| bool isInDescriptionListDetail() const override; |
| bool isInDescriptionListTerm() const override; |
| bool isInCell() const override; |
| |
| bool isDetached() const override; |
| |
| bool isAccessibilityNodeObject() const override { return false; } |
| bool isAccessibilityRenderObject() const override { return false; } |
| bool isAccessibilityScrollbar() const override { return false; } |
| bool isAccessibilityScrollViewInstance() const override { return false; } |
| bool isAXImageInstance() const override { return false; } |
| bool isAccessibilitySVGRoot() const override { return false; } |
| bool isAccessibilitySVGElement() const override { return false; } |
| bool isAccessibilityTableInstance() const override { return false; } |
| bool isAccessibilityTableColumnInstance() const override { return false; } |
| bool isAccessibilityProgressIndicatorInstance() const override { return false; } |
| bool isAccessibilityListBoxInstance() const override { return false; } |
| bool isAXIsolatedObjectInstance() const override { return false; } |
| |
| bool isAttachmentElement() const override { return false; } |
| bool isHeading() const override { return false; } |
| bool isLink() const override { return false; } |
| bool isNativeImage() const override { return false; } |
| bool isImageButton() const override { return false; } |
| bool isPasswordField() const override { return false; } |
| bool isContainedByPasswordField() const override; |
| AccessibilityObject* passwordFieldOrContainingPasswordField() override { return nullptr; } |
| bool isNativeTextControl() const override { return false; } |
| bool isSearchField() const override { return false; } |
| bool isListBoxOption() const override { return false; } |
| bool isAttachment() const override { return false; } |
| bool isMediaTimeline() const override { return false; } |
| bool isMenuRelated() const override { return false; } |
| bool isMenu() const override { return false; } |
| bool isMenuBar() const override { return false; } |
| bool isMenuButton() const override { return false; } |
| bool isMenuItem() const override { return false; } |
| bool isFileUploadButton() const override; |
| bool isInputImage() const override { return false; } |
| bool isProgressIndicator() const override { return false; } |
| bool isSlider() const override { return false; } |
| bool isSliderThumb() const override { return false; } |
| bool isInputSlider() const override { return false; } |
| bool isControl() const override { return false; } |
| bool isLabel() const override { return false; } |
| |
| bool isList() const override { return false; } |
| bool isUnorderedList() const override { return false; } |
| bool isOrderedList() const override { return false; } |
| bool isDescriptionList() const override { return false; } |
| |
| // Table support. |
| bool isTable() const override { return false; } |
| bool isExposable() const override { return true; } |
| bool isDataTable() const override { return false; } |
| int tableLevel() const override { return 0; } |
| bool supportsSelectedRows() const override { return false; } |
| AccessibilityChildrenVector columns() override { return AccessibilityChildrenVector(); } |
| AccessibilityChildrenVector rows() override { return AccessibilityChildrenVector(); } |
| unsigned columnCount() override { return 0; } |
| unsigned rowCount() override { return 0; } |
| AccessibilityChildrenVector cells() override { return AccessibilityChildrenVector(); } |
| AXCoreObject* cellForColumnAndRow(unsigned, unsigned) override { return nullptr; } |
| AccessibilityChildrenVector columnHeaders() override { return AccessibilityChildrenVector(); } |
| AccessibilityChildrenVector rowHeaders() override { return AccessibilityChildrenVector(); } |
| AccessibilityChildrenVector visibleRows() override { return AccessibilityChildrenVector(); } |
| AXCoreObject* headerContainer() override { return nullptr; } |
| int axColumnCount() const override { return 0; } |
| int axRowCount() const override { return 0; } |
| |
| // Table cell support. |
| bool isTableCell() const override { return false; } |
| // Returns the start location and row span of the cell. |
| std::pair<unsigned, unsigned> rowIndexRange() const override { return { 0, 1 }; } |
| // Returns the start location and column span of the cell. |
| std::pair<unsigned, unsigned> columnIndexRange() const override { return { 0, 1 }; } |
| bool isColumnHeaderCell() const override { return false; } |
| bool isRowHeaderCell() const override { return false; } |
| int axColumnIndex() const override { return -1; } |
| int axRowIndex() const override { return -1; } |
| |
| // Table column support. |
| bool isTableColumn() const override { return false; } |
| unsigned columnIndex() const override { return 0; } |
| AXCoreObject* columnHeader() override { return nullptr; } |
| |
| // Table row support. |
| bool isTableRow() const override { return false; } |
| unsigned rowIndex() const override { return 0; } |
| |
| // ARIA tree/grid row support. |
| bool isARIATreeGridRow() const override { return false; } |
| AccessibilityChildrenVector disclosedRows() override; // ARIATreeItem implementation. AccessibilityARIAGridRow overrides this method. |
| AXCoreObject* disclosedByRow() const override { return nullptr; } |
| |
| bool isFieldset() const override { return false; } |
| bool isGroup() const override { return false; } |
| bool isImageMapLink() const override { return false; } |
| bool isMenuList() const override { return false; } |
| bool isMenuListPopup() const override { return false; } |
| bool isMenuListOption() const override { return false; } |
| bool isNativeSpinButton() const override { return false; } |
| AXCoreObject* incrementButton() override { return nullptr; } |
| AXCoreObject* decrementButton() override { return nullptr; } |
| bool isSpinButtonPart() const override { return false; } |
| bool isIncrementor() const override { return false; } |
| bool isMockObject() const override { return false; } |
| virtual bool isMediaControlLabel() const { return false; } |
| bool isMediaObject() const override { return false; } |
| bool isTextControl() const override; |
| bool isARIATextControl() const override; |
| bool isNonNativeTextControl() const override; |
| bool isButton() const override; |
| bool isLandmark() const override; |
| bool isRangeControl() const override; |
| bool isMeter() const override; |
| bool isStyleFormatGroup() const override; |
| bool isFigureElement() const override; |
| bool isKeyboardFocusable() const override; |
| bool isOutput() const override; |
| |
| bool isChecked() const override { return false; } |
| bool isEnabled() const override { return false; } |
| bool isSelected() const override { return false; } |
| bool isFocused() const override { return false; } |
| bool isHovered() const override { return false; } |
| bool isIndeterminate() const override { return false; } |
| bool isLoaded() const override { return false; } |
| bool isMultiSelectable() const override { return false; } |
| bool isOffScreen() const override { return false; } |
| bool isPressed() const override { return false; } |
| bool isUnvisited() const override { return false; } |
| bool isVisited() const override { return false; } |
| bool isRequired() const override { return false; } |
| bool supportsRequiredAttribute() const override { return false; } |
| bool isLinked() const override { return false; } |
| bool isExpanded() const override; |
| bool isVisible() const override { return true; } |
| bool isCollapsed() const override { return false; } |
| void setIsExpanded(bool) override { } |
| FloatRect relativeFrame() const override; |
| FloatRect convertFrameToSpace(const FloatRect&, AccessibilityConversionSpace) const override; |
| HashMap<String, AXEditingStyleValueVariant> resolvedEditingStyles() const override; |
| |
| // In a multi-select list, many items can be selected but only one is active at a time. |
| bool isSelectedOptionActive() const override { return false; } |
| |
| bool hasBoldFont() const override { return false; } |
| bool hasItalicFont() const override { return false; } |
| bool hasMisspelling() const override; |
| std::optional<SimpleRange> misspellingRange(const SimpleRange& start, AccessibilitySearchDirection) const override; |
| bool hasPlainText() const override { return false; } |
| bool hasSameFont(const AXCoreObject&) const override { return false; } |
| bool hasSameFontColor(const AXCoreObject&) const override { return false; } |
| bool hasSameStyle(const AXCoreObject&) const override { return false; } |
| bool hasUnderline() const override { return false; } |
| bool hasHighlighting() const override; |
| |
| bool supportsDatetimeAttribute() const override; |
| String datetimeAttributeValue() const override; |
| |
| bool canSetFocusAttribute() const override { return false; } |
| bool canSetTextRangeAttributes() const override { return false; } |
| bool canSetValueAttribute() const override { return false; } |
| bool canSetNumericValue() const override { return false; } |
| bool canSetSelectedAttribute() const override { return false; } |
| bool canSetSelectedChildren() const override { return false; } |
| bool canSetExpandedAttribute() const override { return false; } |
| |
| Element* element() const override; |
| Node* node() const override { return nullptr; } |
| RenderObject* renderer() const override { return nullptr; } |
| const RenderStyle* style() const; |
| |
| // Note: computeAccessibilityIsIgnored does not consider whether an object is ignored due to presence of modals. |
| // Use accessibilityIsIgnored as the word of law when determining if an object is ignored. |
| virtual bool computeAccessibilityIsIgnored() const { return true; } |
| bool accessibilityIsIgnored() const override; |
| AccessibilityObjectInclusion defaultObjectInclusion() const override; |
| bool accessibilityIsIgnoredByDefault() const override; |
| |
| bool isShowingValidationMessage() const override; |
| String validationMessage() const override; |
| |
| unsigned blockquoteLevel() const override; |
| unsigned headingLevel() const override { return 0; } |
| AccessibilityButtonState checkboxOrRadioValue() const override; |
| String valueDescription() const override { return String(); } |
| float valueForRange() const override { return 0.0f; } |
| float maxValueForRange() const override { return 0.0f; } |
| float minValueForRange() const override { return 0.0f; } |
| float stepValueForRange() const override { return 0.0f; } |
| AXCoreObject* selectedRadioButton() override { return nullptr; } |
| AXCoreObject* selectedTabItem() override { return nullptr; } |
| AXCoreObject* selectedListItem() override; |
| int layoutCount() const override { return 0; } |
| double loadingProgress() const override { return 0; } |
| WEBCORE_EXPORT static bool isARIAControl(AccessibilityRole); |
| bool supportsCheckedState() const override; |
| |
| bool supportsARIARoleDescription() const; |
| bool supportsARIAOwns() const override { return false; } |
| bool isActiveDescendantOfFocusedContainer() const override; |
| |
| bool hasPopup() const override { return false; } |
| String popupValue() const override; |
| bool hasDatalist() const override; |
| bool supportsHasPopup() const override; |
| bool pressedIsPresent() const override; |
| bool ariaIsMultiline() const override; |
| String invalidStatus() const override; |
| bool supportsPressed() const override; |
| bool supportsExpanded() const override; |
| bool supportsChecked() const override; |
| bool supportsRowCountChange() const override; |
| AccessibilitySortDirection sortDirection() const override; |
| bool canvasHasFallbackContent() const override { return false; } |
| bool supportsRangeValue() const override; |
| String identifierAttribute() const override; |
| String linkRelValue() const override; |
| void classList(Vector<String>&) const override; |
| AccessibilityCurrentState currentState() const override; |
| String currentValue() const override; |
| bool supportsCurrent() const override; |
| const String keyShortcutsValue() const override; |
| |
| // This function checks if the object should be ignored when there's a modal dialog displayed. |
| virtual bool ignoredFromModalPresence() const; |
| bool isModalDescendant(Node*) const override; |
| bool isModalNode() const override; |
| |
| bool supportsSetSize() const override; |
| bool supportsPosInSet() const override; |
| int setSize() const override; |
| int posInSet() const override; |
| |
| // ARIA drag and drop |
| bool supportsDropping() const override { return false; } |
| bool supportsDragging() const override { return false; } |
| bool isGrabbed() override { return false; } |
| void setARIAGrabbed(bool) override { } |
| Vector<String> determineDropEffects() const override { return { }; } |
| |
| // Called on the root AX object to return the deepest available element. |
| AXCoreObject* accessibilityHitTest(const IntPoint&) const override { return nullptr; } |
| // Called on the AX object after the render tree determines which is the right AccessibilityRenderObject. |
| AXCoreObject* elementAccessibilityHitTest(const IntPoint&) const override; |
| |
| AXCoreObject* focusedUIElement() const override; |
| |
| virtual AccessibilityObject* firstChild() const { return nullptr; } |
| virtual AccessibilityObject* lastChild() const { return nullptr; } |
| virtual AccessibilityObject* previousSibling() const { return nullptr; } |
| virtual AccessibilityObject* nextSibling() const { return nullptr; } |
| virtual AccessibilityObject* nextSiblingUnignored(int limit) const; |
| virtual AccessibilityObject* previousSiblingUnignored(int limit) const; |
| AccessibilityObject* parentObject() const override { return nullptr; } |
| AccessibilityObject* displayContentsParent() const; |
| AccessibilityObject* parentObjectUnignored() const override; |
| AccessibilityObject* parentObjectIfExists() const override { return nullptr; } |
| static AccessibilityObject* firstAccessibleObjectFromNode(const Node*); |
| void findMatchingObjects(AccessibilitySearchCriteria*, AccessibilityChildrenVector&) override; |
| bool isDescendantOfBarrenParent() const override { return false; } |
| |
| bool isDescendantOfRole(AccessibilityRole) const override; |
| |
| // Text selection |
| Vector<SimpleRange> findTextRanges(const AccessibilitySearchTextCriteria&) const override; |
| Vector<String> performTextOperation(AccessibilityTextOperation const&) override; |
| |
| AccessibilityObject* observableObject() const override { return nullptr; } |
| AccessibilityChildrenVector linkedObjects() const override { return { }; } |
| AccessibilityObject* titleUIElement() const override { return nullptr; } |
| AccessibilityObject* correspondingLabelForControlElement() const override { return nullptr; } |
| AccessibilityObject* correspondingControlForLabelElement() const override { return nullptr; } |
| AccessibilityObject* scrollBar(AccessibilityOrientation) override { return nullptr; } |
| |
| AccessibilityRole ariaRoleAttribute() const override { return AccessibilityRole::Unknown; } |
| bool isPresentationalChildOfAriaRole() const override { return false; } |
| bool ariaRoleHasPresentationalChildren() const override { return false; } |
| bool inheritsPresentationalRole() const override { return false; } |
| |
| // Accessibility Text |
| void accessibilityText(Vector<AccessibilityText>&) const override { }; |
| // A single method for getting a computed label for an AXObject. It condenses the nuances of accessibilityText. Used by Inspector. |
| String computedLabel() override; |
| |
| // A programmatic way to set a name on an AccessibleObject. |
| void setAccessibleName(const AtomString&) override { } |
| bool hasAttributesRequiredForInclusion() const override; |
| |
| // Accessibility Text - (To be deprecated). |
| String accessibilityDescription() const override { return String(); } |
| String title() const override { return String(); } |
| String helpText() const override { return String(); } |
| |
| // Methods for determining accessibility text. |
| bool isARIAStaticText() const override { return ariaRoleAttribute() == AccessibilityRole::StaticText; } |
| String stringValue() const override { return String(); } |
| String textUnderElement(AccessibilityTextUnderElementMode = AccessibilityTextUnderElementMode()) const override { return String(); } |
| String text() const override { return String(); } |
| int textLength() const override { return 0; } |
| String ariaLabeledByAttribute() const override { return String(); } |
| String ariaDescribedByAttribute() const override { return String(); } |
| const String placeholderValue() const override; |
| bool accessibleNameDerivesFromContent() const override; |
| String brailleLabel() const override { return getAttribute(HTMLNames::aria_braillelabelAttr); } |
| String brailleRoleDescription() const override { return getAttribute(HTMLNames::aria_brailleroledescriptionAttr); } |
| String embeddedImageDescription() const override; |
| std::optional<AccessibilityChildrenVector> imageOverlayElements() override { return std::nullopt; } |
| |
| // Abbreviations |
| String expandedTextValue() const override { return String(); } |
| bool supportsExpandedTextValue() const override { return false; } |
| |
| Vector<Element*> elementsFromAttribute(const QualifiedName&) const; |
| |
| // Only if isColorWell() |
| SRGBA<uint8_t> colorValue() const override { return Color::transparentBlack; } |
| |
| AccessibilityRole roleValue() const override { return m_role; } |
| String rolePlatformString() const override; |
| String roleDescription() const override; |
| String subrolePlatformString() const override; |
| String ariaLandmarkRoleDescription() const override; |
| |
| AXObjectCache* axObjectCache() const override; |
| AXID objectID() const override { return m_id; } |
| |
| static AccessibilityObject* anchorElementForNode(Node*); |
| static AccessibilityObject* headingElementForNode(Node*); |
| Element* anchorElement() const override { return nullptr; } |
| bool supportsPressAction() const override; |
| Element* actionElement() const override { return nullptr; } |
| LayoutRect boundingBoxRect() const override { return LayoutRect(); } |
| LayoutRect elementRect() const override = 0; |
| IntPoint clickPoint() override; |
| static IntRect boundingBoxForQuads(RenderObject*, const Vector<FloatQuad>&); |
| Path elementPath() const override { return Path(); } |
| bool supportsPath() const override { return false; } |
| |
| TextIteratorBehaviors textIteratorBehaviorForTextRange() const override; |
| PlainTextRange selectedTextRange() const override { return { }; } |
| int insertionPointLineNumber() const override { return -1; } |
| |
| URL url() const override { return URL(); } |
| VisibleSelection selection() const override { return VisibleSelection(); } |
| String selectedText() const override { return String(); } |
| String accessKey() const override { return nullAtom(); } |
| String localizedActionVerb() const override; |
| String actionVerb() const override; |
| |
| bool isWidget() const override { return false; } |
| Widget* widget() const override { return nullptr; } |
| PlatformWidget platformWidget() const override { return nullptr; } |
| Widget* widgetForAttachmentView() const override { return nullptr; } |
| |
| #if PLATFORM(COCOA) |
| RemoteAXObjectRef remoteParentObject() const override; |
| FloatRect convertRectToPlatformSpace(const FloatRect&, AccessibilityConversionSpace) const override; |
| #endif |
| Page* page() const override; |
| Document* document() const override; |
| FrameView* documentFrameView() const override; |
| Frame* frame() const override; |
| Frame* mainFrame() const override; |
| Document* topDocument() const override; |
| ScrollView* scrollView() const override { return nullptr; } |
| ScrollView* scrollViewAncestor() const override; |
| String language() const override; |
| // 1-based, to match the aria-level spec. |
| unsigned hierarchicalLevel() const override { return 0; } |
| bool isInlineText() const override; |
| |
| // Ensures that the view is focused and active before attempting to set focus to an AccessibilityObject. |
| // Subclasses that override setFocused should call this base implementation first. |
| void setFocused(bool) override; |
| |
| void setSelectedText(const String&) override { } |
| void setSelectedTextRange(const PlainTextRange&) override { } |
| bool setValue(const String&) override { return false; } |
| bool replaceTextInRange(const String&, const PlainTextRange&) override; |
| bool insertText(const String&) override; |
| |
| bool setValue(float) override { return false; } |
| void setSelected(bool) override { } |
| void setSelectedRows(AccessibilityChildrenVector&) override { } |
| |
| void makeRangeVisible(const PlainTextRange&) override { } |
| bool press() override; |
| bool performDefaultAction() override { return press(); } |
| |
| AccessibilityOrientation orientation() const override; |
| void increment() override { } |
| void decrement() override { } |
| |
| virtual void updateRole() { } |
| bool childrenInitialized() const { return m_childrenInitialized; } |
| const AccessibilityChildrenVector& children(bool updateChildrenIfNeeded = true) override; |
| virtual void addChildren() { } |
| enum class DescendIfIgnored : uint8_t { No, Yes }; |
| virtual void addChild(AXCoreObject*, DescendIfIgnored = DescendIfIgnored::Yes); |
| virtual void insertChild(AXCoreObject*, unsigned, DescendIfIgnored = DescendIfIgnored::Yes); |
| virtual bool canHaveChildren() const { return true; } |
| void updateChildrenIfNecessary() override; |
| virtual void setNeedsToUpdateChildren() { } |
| virtual void setNeedsToUpdateSubtree() { } |
| virtual void clearChildren(); |
| virtual bool needsToUpdateChildren() const { return false; } |
| #if PLATFORM(COCOA) |
| void detachFromParent() override; |
| #else |
| void detachFromParent() override { } |
| #endif |
| bool isDetachedFromParent() override { return false; } |
| |
| bool canHaveSelectedChildren() const override { return false; } |
| void selectedChildren(AccessibilityChildrenVector&) override { } |
| void setSelectedChildren(const AccessibilityChildrenVector&) override { } |
| void visibleChildren(AccessibilityChildrenVector&) override { } |
| void tabChildren(AccessibilityChildrenVector&) override { } |
| bool shouldFocusActiveDescendant() const override { return false; } |
| AccessibilityObject* activeDescendant() const override { return nullptr; } |
| AccessibilityObject* firstAnonymousBlockChild() const override; |
| |
| WEBCORE_EXPORT static AccessibilityRole ariaRoleToWebCoreRole(const String&); |
| virtual bool hasAttribute(const QualifiedName&) const; |
| virtual const AtomString& getAttribute(const QualifiedName&) const; |
| std::optional<String> attributeValue(const String&) const override; |
| int getIntegralAttribute(const QualifiedName&) const; |
| bool hasTagName(const QualifiedName&) const override; |
| AtomString tagName() const override; |
| bool hasDisplayContents() const; |
| |
| VisiblePositionRange visiblePositionRange() const override { return VisiblePositionRange(); } |
| VisiblePositionRange visiblePositionRangeForLine(unsigned) const override { return VisiblePositionRange(); } |
| |
| std::optional<SimpleRange> elementRange() const override; |
| static bool replacedNodeNeedsCharacter(Node* replacedNode); |
| |
| VisiblePositionRange visiblePositionRangeForUnorderedPositions(const VisiblePosition&, const VisiblePosition&) const override; |
| VisiblePositionRange positionOfLeftWord(const VisiblePosition&) const override; |
| VisiblePositionRange positionOfRightWord(const VisiblePosition&) const override; |
| VisiblePositionRange leftLineVisiblePositionRange(const VisiblePosition&) const override; |
| VisiblePositionRange rightLineVisiblePositionRange(const VisiblePosition&) const override; |
| VisiblePositionRange sentenceForPosition(const VisiblePosition&) const override; |
| VisiblePositionRange paragraphForPosition(const VisiblePosition&) const override; |
| VisiblePositionRange styleRangeForPosition(const VisiblePosition&) const override; |
| VisiblePositionRange visiblePositionRangeForRange(const PlainTextRange&) const override; |
| VisiblePositionRange lineRangeForPosition(const VisiblePosition&) const override; |
| VisiblePositionRange selectedVisiblePositionRange() const override { return { }; } |
| |
| std::optional<SimpleRange> rangeForPlainTextRange(const PlainTextRange&) const override; |
| #if PLATFORM(MAC) |
| AXTextMarkerRangeRef textMarkerRangeForNSRange(const NSRange&) const override; |
| #endif |
| |
| static String stringForVisiblePositionRange(const VisiblePositionRange&); |
| String stringForRange(const SimpleRange&) const override; |
| IntRect boundsForVisiblePositionRange(const VisiblePositionRange&) const override { return IntRect(); } |
| IntRect boundsForRange(const SimpleRange&) const override { return IntRect(); } |
| int lengthForVisiblePositionRange(const VisiblePositionRange&) const override; |
| void setSelectedVisiblePositionRange(const VisiblePositionRange&) const override { } |
| |
| VisiblePosition visiblePositionForBounds(const IntRect&, AccessibilityVisiblePositionForBounds) const override; |
| VisiblePosition visiblePositionForPoint(const IntPoint&) const override { return VisiblePosition(); } |
| VisiblePosition nextVisiblePosition(const VisiblePosition& visiblePos) const override { return visiblePos.next(); } |
| VisiblePosition previousVisiblePosition(const VisiblePosition& visiblePos) const override { return visiblePos.previous(); } |
| VisiblePosition nextWordEnd(const VisiblePosition&) const override; |
| VisiblePosition previousWordStart(const VisiblePosition&) const override; |
| VisiblePosition nextLineEndPosition(const VisiblePosition&) const override; |
| VisiblePosition previousLineStartPosition(const VisiblePosition&) const override; |
| VisiblePosition nextSentenceEndPosition(const VisiblePosition&) const override; |
| VisiblePosition previousSentenceStartPosition(const VisiblePosition&) const override; |
| VisiblePosition nextParagraphEndPosition(const VisiblePosition&) const override; |
| VisiblePosition previousParagraphStartPosition(const VisiblePosition&) const override; |
| VisiblePosition visiblePositionForIndex(unsigned, bool /*lastIndexOK */) const override { return VisiblePosition(); } |
| |
| VisiblePosition visiblePositionForIndex(int) const override { return VisiblePosition(); } |
| int indexForVisiblePosition(const VisiblePosition&) const override { return 0; } |
| |
| AccessibilityObject* accessibilityObjectForPosition(const VisiblePosition&) const override; |
| int lineForPosition(const VisiblePosition&) const override; |
| PlainTextRange plainTextRangeForVisiblePositionRange(const VisiblePositionRange&) const override; |
| int index(const VisiblePosition&) const override { return -1; } |
| |
| void lineBreaks(Vector<int>&) const override { } |
| PlainTextRange doAXRangeForLine(unsigned) const override { return PlainTextRange(); } |
| PlainTextRange doAXRangeForPosition(const IntPoint&) const override; |
| PlainTextRange doAXRangeForIndex(unsigned) const override { return PlainTextRange(); } |
| PlainTextRange doAXStyleRangeForIndex(unsigned) const override; |
| |
| String doAXStringForRange(const PlainTextRange&) const override { return String(); } |
| IntRect doAXBoundsForRange(const PlainTextRange&) const override { return IntRect(); } |
| IntRect doAXBoundsForRangeUsingCharacterOffset(const PlainTextRange&) const override { return IntRect(); } |
| static StringView listMarkerTextForNodeAndPosition(Node*, const VisiblePosition&); |
| |
| unsigned doAXLineForIndex(unsigned) override; |
| |
| String computedRoleString() const override; |
| |
| String stringValueForMSAA() const override { return String(); } |
| String stringRoleForMSAA() const override { return String(); } |
| String nameForMSAA() const override { return String(); } |
| String descriptionForMSAA() const override { return String(); } |
| AccessibilityRole roleValueForMSAA() const override { return roleValue(); } |
| |
| String passwordFieldValue() const override { return String(); } |
| bool isValueAutofilled() const override; |
| bool isValueAutofillAvailable() const override; |
| AutoFillButtonType valueAutofillButtonType() const override; |
| |
| // Used by an ARIA tree to get all its rows. |
| void ariaTreeRows(AccessibilityChildrenVector&) override; |
| // Used by an ARIA tree item to get only its content, and not its child tree items and groups. |
| AccessibilityChildrenVector ariaTreeItemContent() override; |
| |
| // ARIA live-region features. |
| bool supportsLiveRegion(bool excludeIfOff = true) const override; |
| bool isInsideLiveRegion(bool excludeIfOff = true) const override; |
| AccessibilityObject* liveRegionAncestor(bool excludeIfOff = true) const override; |
| const String liveRegionStatus() const override { return String(); } |
| const String liveRegionRelevant() const override { return nullAtom(); } |
| bool liveRegionAtomic() const override { return false; } |
| bool isBusy() const override { return false; } |
| static const String defaultLiveRegionStatusForRole(AccessibilityRole); |
| static bool liveRegionStatusIsEnabled(const AtomString&); |
| static bool contentEditableAttributeIsEnabled(Element*); |
| bool hasContentEditableAttributeSet() const override; |
| |
| bool supportsReadOnly() const override; |
| String readOnlyValue() const override; |
| |
| bool supportsAutoComplete() const override; |
| String autoCompleteValue() const override; |
| |
| bool hasARIAValueNow() const override { return hasAttribute(HTMLNames::aria_valuenowAttr); } |
| bool supportsARIAAttributes() const override; |
| |
| // CSS3 Speech properties. |
| OptionSet<SpeakAs> speakAsProperty() const override { return OptionSet<SpeakAs> { }; } |
| |
| // Make this object visible by scrolling as many nested scrollable views as needed. |
| void scrollToMakeVisible() const override; |
| // Same, but if the whole object can't be made visible, try for this subrect, in local coordinates. |
| void scrollToMakeVisibleWithSubFocus(const IntRect&) const override; |
| // Scroll this object to a given point in global coordinates of the top-level window. |
| void scrollToGlobalPoint(const IntPoint&) const override; |
| |
| bool scrollByPage(ScrollByPageDirection) const override; |
| IntPoint scrollPosition() const override; |
| AccessibilityChildrenVector contents() override; |
| IntSize scrollContentsSize() const override; |
| IntRect scrollVisibleContentRect() const override; |
| void scrollToMakeVisible(const ScrollRectToVisibleOptions&) const override; |
| |
| bool lastKnownIsIgnoredValue(); |
| void setLastKnownIsIgnoredValue(bool); |
| bool hasIgnoredValueChanged(); |
| |
| // All math elements return true for isMathElement(). |
| bool isMathElement() const override { return false; } |
| bool isMathFraction() const override { return false; } |
| bool isMathFenced() const override { return false; } |
| bool isMathSubscriptSuperscript() const override { return false; } |
| bool isMathRow() const override { return false; } |
| bool isMathUnderOver() const override { return false; } |
| bool isMathRoot() const override { return false; } |
| bool isMathSquareRoot() const override { return false; } |
| bool isMathText() const override { return false; } |
| bool isMathNumber() const override { return false; } |
| bool isMathOperator() const override { return false; } |
| bool isMathFenceOperator() const override { return false; } |
| bool isMathSeparatorOperator() const override { return false; } |
| bool isMathIdentifier() const override { return false; } |
| bool isMathTable() const override { return false; } |
| bool isMathTableRow() const override { return false; } |
| bool isMathTableCell() const override { return false; } |
| bool isMathMultiscript() const override { return false; } |
| bool isMathToken() const override { return false; } |
| bool isMathScriptObject(AccessibilityMathScriptObjectType) const override { return false; } |
| bool isMathMultiscriptObject(AccessibilityMathMultiscriptObjectType) const override { return false; } |
| |
| // Root components. |
| std::optional<AccessibilityChildrenVector> mathRadicand() override { return std::nullopt; } |
| AXCoreObject* mathRootIndexObject() override { return nullptr; } |
| |
| // Under over components. |
| AXCoreObject* mathUnderObject() override { return nullptr; } |
| AXCoreObject* mathOverObject() override { return nullptr; } |
| |
| // Fraction components. |
| AXCoreObject* mathNumeratorObject() override { return nullptr; } |
| AXCoreObject* mathDenominatorObject() override { return nullptr; } |
| |
| // Subscript/superscript components. |
| AXCoreObject* mathBaseObject() override { return nullptr; } |
| AXCoreObject* mathSubscriptObject() override { return nullptr; } |
| AXCoreObject* mathSuperscriptObject() override { return nullptr; } |
| |
| // Fenced components. |
| String mathFencedOpenString() const override { return String(); } |
| String mathFencedCloseString() const override { return String(); } |
| int mathLineThickness() const override { return 0; } |
| bool isAnonymousMathOperator() const override { return false; } |
| |
| // Multiscripts components. |
| void mathPrescripts(AccessibilityMathMultiscriptPairs&) override { } |
| void mathPostscripts(AccessibilityMathMultiscriptPairs&) override { } |
| |
| // Visibility. |
| bool isAXHidden() const override; |
| bool isDOMHidden() const override; |
| bool isHidden() const override { return isAXHidden() || isDOMHidden(); } |
| |
| #if PLATFORM(COCOA) |
| void overrideAttachmentParent(AXCoreObject* parent) override; |
| #else |
| void overrideAttachmentParent(AXCoreObject*) override { } |
| #endif |
| |
| #if ENABLE(ACCESSIBILITY) |
| // a platform-specific method for determining if an attachment is ignored |
| bool accessibilityIgnoreAttachment() const override; |
| // gives platforms the opportunity to indicate if and how an object should be included |
| AccessibilityObjectInclusion accessibilityPlatformIncludesObject() const override; |
| #else |
| bool accessibilityIgnoreAttachment() const override { return true; } |
| AccessibilityObjectInclusion accessibilityPlatformIncludesObject() const override { return AccessibilityObjectInclusion::DefaultBehavior; } |
| #endif |
| |
| #if PLATFORM(IOS_FAMILY) |
| int accessibilityPasswordFieldLength() override; |
| bool hasTouchEventListener() const override; |
| bool isInputTypePopupButton() const override; |
| #endif |
| |
| // allows for an AccessibilityObject to update its render tree or perform |
| // other operations update type operations |
| void updateBackingStore() override; |
| |
| #if PLATFORM(COCOA) |
| bool preventKeyboardDOMEventDispatch() const override; |
| void setPreventKeyboardDOMEventDispatch(bool) override; |
| bool fileUploadButtonReturnsValueInTitle() const override; |
| String speechHintAttributeValue() const override; |
| String descriptionAttributeValue() const override; |
| String helpTextAttributeValue() const override; |
| String titleAttributeValue() const override; |
| bool hasApplePDFAnnotationAttribute() const override { return hasAttribute(HTMLNames::x_apple_pdf_annotationAttr); } |
| #endif |
| |
| #if PLATFORM(MAC) |
| bool caretBrowsingEnabled() const override; |
| void setCaretBrowsingEnabled(bool) override; |
| #endif |
| |
| AccessibilityObject* focusableAncestor() override; |
| AccessibilityObject* editableAncestor() override; |
| AccessibilityObject* highestEditableAncestor() override; |
| |
| const AccessibilityScrollView* ancestorAccessibilityScrollView(bool includeSelf) const override; |
| AccessibilityObject* webAreaObject() const override { return nullptr; } |
| |
| void clearIsIgnoredFromParentData() override { m_isIgnoredFromParentData = { }; } |
| void setIsIgnoredFromParentDataForChild(AXCoreObject*) override; |
| |
| PAL::SessionID sessionID() const override; |
| String documentURI() const override; |
| String documentEncoding() const override; |
| AccessibilityChildrenVector documentLinks() override { return AccessibilityChildrenVector(); } |
| |
| AccessibilityChildrenVector relatedObjects(AXRelationType) const override; |
| protected: |
| AccessibilityObject() = default; |
| |
| // FIXME: Make more of these member functions private. |
| |
| void detachRemoteParts(AccessibilityDetachmentType) override; |
| void detachPlatformWrapper(AccessibilityDetachmentType) override; |
| |
| void setIsIgnoredFromParentData(AccessibilityIsIgnoredFromParentData& data) override { m_isIgnoredFromParentData = data; } |
| |
| bool isAccessibilityObject() const override { return true; } |
| |
| // If this object itself scrolls, return its ScrollableArea. |
| virtual ScrollableArea* getScrollableAreaIfScrollable() const { return nullptr; } |
| virtual void scrollTo(const IntPoint&) const { } |
| ScrollableArea* scrollableAreaAncestor() const; |
| void scrollAreaAndAncestor(std::pair<ScrollableArea*, AccessibilityObject*>&) const; |
| |
| virtual bool shouldIgnoreAttributeRole() const { return false; } |
| virtual AccessibilityRole buttonRoleType() const; |
| String rolePlatformDescription() const; |
| bool isOnScreen() const override; |
| bool dispatchTouchEvent(); |
| |
| static bool isARIAInput(AccessibilityRole); |
| |
| virtual bool exposesTitleUIElement() const { return true; } |
| FloatRect unobscuredContentRect() const override; |
| AccessibilityObject* radioGroupAncestor() const; |
| |
| bool allowsTextRanges() const; |
| unsigned getLengthForTextRange() const; |
| String innerHTML() const override; |
| String outerHTML() const override; |
| |
| private: |
| bool hasAncestorFlag(AXAncestorFlag flag) const { return ancestorFlagsAreInitialized() && m_ancestorFlags.contains(flag); } |
| std::optional<SimpleRange> rangeOfStringClosestToRangeInDirection(const SimpleRange&, AccessibilitySearchDirection, const Vector<String>&) const; |
| std::optional<SimpleRange> selectionRange() const; |
| std::optional<SimpleRange> findTextRange(const Vector<String>& searchStrings, const SimpleRange& start, AccessibilitySearchTextDirection) const; |
| std::optional<SimpleRange> visibleCharacterRange() const override; |
| std::optional<SimpleRange> visibleCharacterRangeInternal(const std::optional<SimpleRange>&, const FloatRect&, const IntRect&) const; |
| Vector<BoundaryPoint> previousLineStartBoundaryPoints(const VisiblePosition&, const SimpleRange&, unsigned) const; |
| std::optional<VisiblePosition> previousLineStartPositionInternal(const VisiblePosition&) const; |
| bool boundaryPointsContainedInRect(const BoundaryPoint&, const BoundaryPoint&, const FloatRect&) const; |
| std::optional<BoundaryPoint> lastBoundaryPointContainedInRect(const Vector<BoundaryPoint>&, const BoundaryPoint&, const FloatRect&, int, int) const; |
| std::optional<BoundaryPoint> lastBoundaryPointContainedInRect(const Vector<BoundaryPoint>& boundaryPoints, const BoundaryPoint& startBoundaryPoint, const FloatRect& targetRect) const; |
| |
| void ariaTreeRows(AccessibilityChildrenVector& rows, AccessibilityChildrenVector& ancestors); |
| |
| #if PLATFORM(COCOA) && ENABLE(MODEL_ELEMENT) |
| Vector<RetainPtr<id>> modelElementChildren() override; |
| #endif |
| |
| protected: // FIXME: Make the data members private. |
| AccessibilityChildrenVector m_children; |
| mutable bool m_childrenInitialized { false }; |
| AccessibilityRole m_role { AccessibilityRole::Unknown }; |
| private: |
| AXID m_id; |
| OptionSet<AXAncestorFlag> m_ancestorFlags; |
| AccessibilityObjectInclusion m_lastKnownIsIgnoredValue { AccessibilityObjectInclusion::DefaultBehavior }; |
| // std::nullopt is a valid cached value if this object has no visible characters. |
| mutable std::optional<SimpleRange> m_cachedVisibleCharacterRange; |
| // This is std::nullopt if we haven't cached any input yet. |
| mutable std::optional<std::tuple<std::optional<SimpleRange>, FloatRect, IntRect>> m_cachedVisibleCharacterRangeInputs; |
| protected: // FIXME: Make the data members private. |
| // FIXME: This can be replaced by AXAncestorFlags. |
| AccessibilityIsIgnoredFromParentData m_isIgnoredFromParentData; |
| bool m_childrenDirty { false }; |
| bool m_subtreeDirty { false }; |
| }; |
| |
| #if ENABLE(ACCESSIBILITY) |
| inline bool AccessibilityObject::hasDisplayContents() const |
| { |
| return is<Element>(node()) && downcast<Element>(node())->hasDisplayContents(); |
| } |
| |
| inline std::optional<BoundaryPoint> AccessibilityObject::lastBoundaryPointContainedInRect(const Vector<BoundaryPoint>& boundaryPoints, const BoundaryPoint& startBoundaryPoint, const FloatRect& targetRect) const |
| { |
| return lastBoundaryPointContainedInRect(boundaryPoints, startBoundaryPoint, targetRect, 0, boundaryPoints.size() - 1); |
| } |
| |
| inline VisiblePosition AccessibilityObject::previousLineStartPosition(const VisiblePosition& position) const |
| { |
| return previousLineStartPositionInternal(position).value_or(VisiblePosition()); |
| } |
| #else |
| inline bool AccessibilityObject::hasDisplayContents() const { return false; } |
| inline std::optional<BoundaryPoint> AccessibilityObject::lastBoundaryPointContainedInRect(const Vector<BoundaryPoint>&, const BoundaryPoint&, const FloatRect&) const { return std::nullopt; } |
| inline VisiblePosition AccessibilityObject::previousLineStartPosition(const VisiblePosition&) const { return { }; } |
| #endif |
| |
| #if !ENABLE(ACCESSIBILITY) |
| inline const AccessibilityObject::AccessibilityChildrenVector& AccessibilityObject::children(bool) { return m_children; } |
| inline String AccessibilityObject::localizedActionVerb() const { return emptyString(); } |
| inline String AccessibilityObject::actionVerb() const { return emptyString(); } |
| inline int AccessibilityObject::lineForPosition(const VisiblePosition&) const { return -1; } |
| inline void AccessibilityObject::updateBackingStore() { } |
| inline void AccessibilityObject::detachPlatformWrapper(AccessibilityDetachmentType) { } |
| #endif |
| |
| #if !(ENABLE(ACCESSIBILITY) && USE(ATSPI)) |
| inline bool AccessibilityObject::allowsTextRanges() const { return true; } |
| inline unsigned AccessibilityObject::getLengthForTextRange() const { return text().length(); } |
| #endif |
| |
| AccessibilityObject* firstAccessibleObjectFromNode(const Node*, const Function<bool(const AccessibilityObject&)>& isAccessible); |
| |
| namespace Accessibility { |
| |
| using PlatformRoleMap = HashMap<AccessibilityRole, String, DefaultHash<unsigned>, WTF::UnsignedWithZeroKeyHashTraits<unsigned>>; |
| |
| PlatformRoleMap createPlatformRoleMap(); |
| String roleToPlatformString(AccessibilityRole); |
| |
| } // namespace Accessibility |
| |
| } // namespace WebCore |
| |
| #define SPECIALIZE_TYPE_TRAITS_ACCESSIBILITY(ToValueTypeName, predicate) \ |
| SPECIALIZE_TYPE_TRAITS_BEGIN(WebCore::ToValueTypeName) \ |
| static bool isType(const WebCore::AXCoreObject& object) { return object.predicate; } \ |
| SPECIALIZE_TYPE_TRAITS_END() |
| |
| SPECIALIZE_TYPE_TRAITS_BEGIN(WebCore::AccessibilityObject) |
| static bool isType(const WebCore::AXCoreObject& context) { return context.isAccessibilityObject(); } |
| SPECIALIZE_TYPE_TRAITS_END() |