2 * Copyright (C) 2008, 2009, 2011 Apple Inc. All rights reserved.
3 * Copyright (C) 2008 Nuanti Ltd.
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * 3. Neither the name of Apple Inc. ("Apple") nor the names of
15 * its contributors may be used to endorse or promote products derived
16 * from this software without specific prior written permission.
18 * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
19 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
20 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
21 * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
22 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
23 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
24 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
25 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32 #include "AccessibilityObjectInterface.h"
33 #include "FloatQuad.h"
34 #include "LayoutRect.h"
36 #include <wtf/Forward.h>
37 #include <wtf/Function.h>
38 #include <wtf/RefPtr.h>
39 #include <wtf/Vector.h>
42 #include <wtf/RetainPtr.h>
48 OBJC_CLASS NSAttributedString;
50 OBJC_CLASS NSMutableAttributedString;
59 class AccessibilityObject;
64 struct AccessibilityText {
66 AccessibilityTextSource textSource;
68 AccessibilityText(const String& t, const AccessibilityTextSource& s)
74 bool nodeHasPresentationRole(Node*);
76 class AccessibilityObject : public AXCoreObject {
78 virtual ~AccessibilityObject();
80 // After constructing an AccessibilityObject, it must be given a
81 // unique ID, then added to AXObjectCache, and finally init() must
83 void setObjectID(AXID id) override { m_id = id; }
84 void init() override { }
86 // Prefer using the dedicated functions over consuming these flag values directly, as the flags can sometimes be uninitialized.
87 // Also, the dedicated functions traverse for you if the flags aren't yet initialized.
88 // For example, use `hasDocumentRoleAncestor()` instead of `ancestorFlags().contains(AXAncestorFlag::HasDocumentRoleAncestor)`.
89 OptionSet<AXAncestorFlag> ancestorFlags() const { return m_ancestorFlags; }
91 void addAncestorFlags(const OptionSet<AXAncestorFlag>& flags) { m_ancestorFlags.add(flags); }
92 bool ancestorFlagsAreInitialized() const { return m_ancestorFlags.contains(AXAncestorFlag::FlagsInitialized); }
93 // Computes the flags that this object matches (no traversal is done).
94 OptionSet<AXAncestorFlag> computeAncestorFlags() const;
95 // Computes the flags that this object and all ancestors match, traversing all the way to the root.
96 OptionSet<AXAncestorFlag> computeAncestorFlagsWithTraversal() const;
97 void initializeAncestorFlags(const OptionSet<AXAncestorFlag>&);
98 bool hasAncestorMatchingFlag(AXAncestorFlag) const;
99 bool matchesAncestorFlag(AXAncestorFlag) const;
101 bool hasDocumentRoleAncestor() const override;
102 bool hasWebApplicationAncestor() const override;
103 bool isInDescriptionListDetail() const override;
104 bool isInDescriptionListTerm() const override;
105 bool isInCell() const override;
107 bool isDetached() const override;
109 bool isAccessibilityNodeObject() const override { return false; }
110 bool isAccessibilityRenderObject() const override { return false; }
111 bool isAccessibilityScrollbar() const override { return false; }
112 bool isAccessibilityScrollViewInstance() const override { return false; }
113 bool isAXImageInstance() const override { return false; }
114 bool isAccessibilitySVGRoot() const override { return false; }
115 bool isAccessibilitySVGElement() const override { return false; }
116 bool isAccessibilityTableInstance() const override { return false; }
117 bool isAccessibilityTableColumnInstance() const override { return false; }
118 bool isAccessibilityProgressIndicatorInstance() const override { return false; }
119 bool isAccessibilityListBoxInstance() const override { return false; }
120 bool isAXIsolatedObjectInstance() const override { return false; }
122 bool isAttachmentElement() const override { return false; }
123 bool isHeading() const override { return false; }
124 bool isLink() const override { return false; }
125 bool isNativeImage() const override { return false; }
126 bool isImageButton() const override { return false; }
127 bool isPasswordField() const override { return false; }
128 bool isContainedByPasswordField() const override;
129 AccessibilityObject* passwordFieldOrContainingPasswordField() override { return nullptr; }
130 bool isNativeTextControl() const override { return false; }
131 bool isSearchField() const override { return false; }
132 bool isListBoxOption() const override { return false; }
133 bool isAttachment() const override { return false; }
134 bool isMediaTimeline() const override { return false; }
135 bool isMenuRelated() const override { return false; }
136 bool isMenu() const override { return false; }
137 bool isMenuBar() const override { return false; }
138 bool isMenuButton() const override { return false; }
139 bool isMenuItem() const override { return false; }
140 bool isFileUploadButton() const override;
141 bool isInputImage() const override { return false; }
142 bool isProgressIndicator() const override { return false; }
143 bool isSlider() const override { return false; }
144 bool isSliderThumb() const override { return false; }
145 bool isInputSlider() const override { return false; }
146 bool isControl() const override { return false; }
147 bool isLabel() const override { return false; }
149 bool isList() const override { return false; }
150 bool isUnorderedList() const override { return false; }
151 bool isOrderedList() const override { return false; }
152 bool isDescriptionList() const override { return false; }
155 bool isTable() const override { return false; }
156 bool isExposable() const override { return true; }
157 bool isDataTable() const override { return false; }
158 int tableLevel() const override { return 0; }
159 bool supportsSelectedRows() const override { return false; }
160 AccessibilityChildrenVector columns() override { return AccessibilityChildrenVector(); }
161 AccessibilityChildrenVector rows() override { return AccessibilityChildrenVector(); }
162 unsigned columnCount() override { return 0; }
163 unsigned rowCount() override { return 0; }
164 AccessibilityChildrenVector cells() override { return AccessibilityChildrenVector(); }
165 AXCoreObject* cellForColumnAndRow(unsigned, unsigned) override { return nullptr; }
166 AccessibilityChildrenVector columnHeaders() override { return AccessibilityChildrenVector(); }
167 AccessibilityChildrenVector rowHeaders() override { return AccessibilityChildrenVector(); }
168 AccessibilityChildrenVector visibleRows() override { return AccessibilityChildrenVector(); }
169 AXCoreObject* headerContainer() override { return nullptr; }
170 int axColumnCount() const override { return 0; }
171 int axRowCount() const override { return 0; }
173 // Table cell support.
174 bool isTableCell() const override { return false; }
175 // Returns the start location and row span of the cell.
176 std::pair<unsigned, unsigned> rowIndexRange() const override { return { 0, 1 }; }
177 // Returns the start location and column span of the cell.
178 std::pair<unsigned, unsigned> columnIndexRange() const override { return { 0, 1 }; }
179 bool isColumnHeaderCell() const override { return false; }
180 bool isRowHeaderCell() const override { return false; }
181 int axColumnIndex() const override { return -1; }
182 int axRowIndex() const override { return -1; }
184 // Table column support.
185 bool isTableColumn() const override { return false; }
186 unsigned columnIndex() const override { return 0; }
187 AXCoreObject* columnHeader() override { return nullptr; }
189 // Table row support.
190 bool isTableRow() const override { return false; }
191 unsigned rowIndex() const override { return 0; }
193 // ARIA tree/grid row support.
194 bool isARIATreeGridRow() const override { return false; }
195 AccessibilityChildrenVector disclosedRows() override; // ARIATreeItem implementation. AccessibilityARIAGridRow overrides this method.
196 AXCoreObject* disclosedByRow() const override { return nullptr; }
198 bool isFieldset() const override { return false; }
199 bool isGroup() const override { return false; }
200 bool isImageMapLink() const override { return false; }
201 bool isMenuList() const override { return false; }
202 bool isMenuListPopup() const override { return false; }
203 bool isMenuListOption() const override { return false; }
204 bool isNativeSpinButton() const override { return false; }
205 AXCoreObject* incrementButton() override { return nullptr; }
206 AXCoreObject* decrementButton() override { return nullptr; }
207 bool isSpinButtonPart() const override { return false; }
208 bool isIncrementor() const override { return false; }
209 bool isMockObject() const override { return false; }
210 virtual bool isMediaControlLabel() const { return false; }
211 bool isMediaObject() const override { return false; }
212 bool isTextControl() const override;
213 bool isARIATextControl() const override;
214 bool isNonNativeTextControl() const override;
215 bool isButton() const override;
216 bool isLandmark() const override;
217 bool isRangeControl() const override;
218 bool isMeter() const override;
219 bool isStyleFormatGroup() const override;
220 bool isFigureElement() const override;
221 bool isKeyboardFocusable() const override;
222 bool isOutput() const override;
224 bool isChecked() const override { return false; }
225 bool isEnabled() const override { return false; }
226 bool isSelected() const override { return false; }
227 bool isFocused() const override { return false; }
228 bool isHovered() const override { return false; }
229 bool isIndeterminate() const override { return false; }
230 bool isLoaded() const override { return false; }
231 bool isMultiSelectable() const override { return false; }
232 bool isOffScreen() const override { return false; }
233 bool isPressed() const override { return false; }
234 bool isUnvisited() const override { return false; }
235 bool isVisited() const override { return false; }
236 bool isRequired() const override { return false; }
237 bool supportsRequiredAttribute() const override { return false; }
238 bool isLinked() const override { return false; }
239 bool isExpanded() const override;
240 bool isVisible() const override { return true; }
241 bool isCollapsed() const override { return false; }
242 void setIsExpanded(bool) override { }
243 FloatRect relativeFrame() const override;
244 FloatRect convertFrameToSpace(const FloatRect&, AccessibilityConversionSpace) const override;
245 HashMap<String, AXEditingStyleValueVariant> resolvedEditingStyles() const override;
247 // In a multi-select list, many items can be selected but only one is active at a time.
248 bool isSelectedOptionActive() const override { return false; }
250 bool hasBoldFont() const override { return false; }
251 bool hasItalicFont() const override { return false; }
252 bool hasMisspelling() const override;
253 std::optional<SimpleRange> misspellingRange(const SimpleRange& start, AccessibilitySearchDirection) const override;
254 bool hasPlainText() const override { return false; }
255 bool hasSameFont(const AXCoreObject&) const override { return false; }
256 bool hasSameFontColor(const AXCoreObject&) const override { return false; }
257 bool hasSameStyle(const AXCoreObject&) const override { return false; }
258 bool hasUnderline() const override { return false; }
259 bool hasHighlighting() const override;
261 bool supportsDatetimeAttribute() const override;
262 String datetimeAttributeValue() const override;
264 bool canSetFocusAttribute() const override { return false; }
265 bool canSetTextRangeAttributes() const override { return false; }
266 bool canSetValueAttribute() const override { return false; }
267 bool canSetNumericValue() const override { return false; }
268 bool canSetSelectedAttribute() const override { return false; }
269 bool canSetSelectedChildren() const override { return false; }
270 bool canSetExpandedAttribute() const override { return false; }
272 Element* element() const override;
273 Node* node() const override { return nullptr; }
274 RenderObject* renderer() const override { return nullptr; }
275 const RenderStyle* style() const;
277 // Note: computeAccessibilityIsIgnored does not consider whether an object is ignored due to presence of modals.
278 // Use accessibilityIsIgnored as the word of law when determining if an object is ignored.
279 virtual bool computeAccessibilityIsIgnored() const { return true; }
280 bool accessibilityIsIgnored() const override;
281 AccessibilityObjectInclusion defaultObjectInclusion() const override;
282 bool accessibilityIsIgnoredByDefault() const override;
284 bool isShowingValidationMessage() const override;
285 String validationMessage() const override;
287 unsigned blockquoteLevel() const override;
288 unsigned headingLevel() const override { return 0; }
289 AccessibilityButtonState checkboxOrRadioValue() const override;
290 String valueDescription() const override { return String(); }
291 float valueForRange() const override { return 0.0f; }
292 float maxValueForRange() const override { return 0.0f; }
293 float minValueForRange() const override { return 0.0f; }
294 float stepValueForRange() const override { return 0.0f; }
295 AXCoreObject* selectedRadioButton() override { return nullptr; }
296 AXCoreObject* selectedTabItem() override { return nullptr; }
297 AXCoreObject* selectedListItem() override;
298 int layoutCount() const override { return 0; }
299 double loadingProgress() const override { return 0; }
300 WEBCORE_EXPORT static bool isARIAControl(AccessibilityRole);
301 bool supportsCheckedState() const override;
303 bool supportsARIARoleDescription() const;
304 bool supportsARIAOwns() const override { return false; }
305 bool isActiveDescendantOfFocusedContainer() const override;
307 bool hasPopup() const override { return false; }
308 String popupValue() const override;
309 bool hasDatalist() const override;
310 bool supportsHasPopup() const override;
311 bool pressedIsPresent() const override;
312 bool ariaIsMultiline() const override;
313 String invalidStatus() const override;
314 bool supportsPressed() const override;
315 bool supportsExpanded() const override;
316 bool supportsChecked() const override;
317 bool supportsRowCountChange() const override;
318 AccessibilitySortDirection sortDirection() const override;
319 bool canvasHasFallbackContent() const override { return false; }
320 bool supportsRangeValue() const override;
321 String identifierAttribute() const override;
322 String linkRelValue() const override;
323 void classList(Vector<String>&) const override;
324 AccessibilityCurrentState currentState() const override;
325 String currentValue() const override;
326 bool supportsCurrent() const override;
327 const String keyShortcutsValue() const override;
329 // This function checks if the object should be ignored when there's a modal dialog displayed.
330 virtual bool ignoredFromModalPresence() const;
331 bool isModalDescendant(Node*) const override;
332 bool isModalNode() const override;
334 bool supportsSetSize() const override;
335 bool supportsPosInSet() const override;
336 int setSize() const override;
337 int posInSet() const override;
339 // ARIA drag and drop
340 bool supportsDropping() const override { return false; }
341 bool supportsDragging() const override { return false; }
342 bool isGrabbed() override { return false; }
343 void setARIAGrabbed(bool) override { }
344 Vector<String> determineDropEffects() const override { return { }; }
346 // Called on the root AX object to return the deepest available element.
347 AXCoreObject* accessibilityHitTest(const IntPoint&) const override { return nullptr; }
348 // Called on the AX object after the render tree determines which is the right AccessibilityRenderObject.
349 AXCoreObject* elementAccessibilityHitTest(const IntPoint&) const override;
351 AXCoreObject* focusedUIElement() const override;
353 virtual AccessibilityObject* firstChild() const { return nullptr; }
354 virtual AccessibilityObject* lastChild() const { return nullptr; }
355 virtual AccessibilityObject* previousSibling() const { return nullptr; }
356 virtual AccessibilityObject* nextSibling() const { return nullptr; }
357 virtual AccessibilityObject* nextSiblingUnignored(int limit) const;
358 virtual AccessibilityObject* previousSiblingUnignored(int limit) const;
359 AccessibilityObject* parentObject() const override { return nullptr; }
360 AccessibilityObject* displayContentsParent() const;
361 AccessibilityObject* parentObjectUnignored() const override;
362 AccessibilityObject* parentObjectIfExists() const override { return nullptr; }
363 static AccessibilityObject* firstAccessibleObjectFromNode(const Node*);
364 void findMatchingObjects(AccessibilitySearchCriteria*, AccessibilityChildrenVector&) override;
365 bool isDescendantOfBarrenParent() const override { return false; }
367 bool isDescendantOfRole(AccessibilityRole) const override;
370 Vector<SimpleRange> findTextRanges(const AccessibilitySearchTextCriteria&) const override;
371 Vector<String> performTextOperation(AccessibilityTextOperation const&) override;
373 AccessibilityObject* observableObject() const override { return nullptr; }
374 AccessibilityChildrenVector linkedObjects() const override { return { }; }
375 AccessibilityObject* titleUIElement() const override { return nullptr; }
376 AccessibilityObject* correspondingLabelForControlElement() const override { return nullptr; }
377 AccessibilityObject* correspondingControlForLabelElement() const override { return nullptr; }
378 AccessibilityObject* scrollBar(AccessibilityOrientation) override { return nullptr; }
380 AccessibilityRole ariaRoleAttribute() const override { return AccessibilityRole::Unknown; }
381 bool isPresentationalChildOfAriaRole() const override { return false; }
382 bool ariaRoleHasPresentationalChildren() const override { return false; }
383 bool inheritsPresentationalRole() const override { return false; }
385 // Accessibility Text
386 void accessibilityText(Vector<AccessibilityText>&) const override { };
387 // A single method for getting a computed label for an AXObject. It condenses the nuances of accessibilityText. Used by Inspector.
388 String computedLabel() override;
390 // A programmatic way to set a name on an AccessibleObject.
391 void setAccessibleName(const AtomString&) override { }
392 bool hasAttributesRequiredForInclusion() const override;
394 // Accessibility Text - (To be deprecated).
395 String accessibilityDescription() const override { return String(); }
396 String title() const override { return String(); }
397 String helpText() const override { return String(); }
399 // Methods for determining accessibility text.
400 bool isARIAStaticText() const override { return ariaRoleAttribute() == AccessibilityRole::StaticText; }
401 String stringValue() const override { return String(); }
402 String textUnderElement(AccessibilityTextUnderElementMode = AccessibilityTextUnderElementMode()) const override { return String(); }
403 String text() const override { return String(); }
404 int textLength() const override { return 0; }
405 String ariaLabeledByAttribute() const override { return String(); }
406 String ariaDescribedByAttribute() const override { return String(); }
407 const String placeholderValue() const override;
408 bool accessibleNameDerivesFromContent() const override;
409 String brailleLabel() const override { return getAttribute(HTMLNames::aria_braillelabelAttr); }
410 String brailleRoleDescription() const override { return getAttribute(HTMLNames::aria_brailleroledescriptionAttr); }
411 String embeddedImageDescription() const override;
412 std::optional<AccessibilityChildrenVector> imageOverlayElements() override { return std::nullopt; }
415 String expandedTextValue() const override { return String(); }
416 bool supportsExpandedTextValue() const override { return false; }
418 Vector<Element*> elementsFromAttribute(const QualifiedName&) const;
420 // Only if isColorWell()
421 SRGBA<uint8_t> colorValue() const override { return Color::transparentBlack; }
423 AccessibilityRole roleValue() const override { return m_role; }
424 String rolePlatformString() const override;
425 String roleDescription() const override;
426 String subrolePlatformString() const override;
427 String ariaLandmarkRoleDescription() const override;
429 AXObjectCache* axObjectCache() const override;
430 AXID objectID() const override { return m_id; }
432 static AccessibilityObject* anchorElementForNode(Node*);
433 static AccessibilityObject* headingElementForNode(Node*);
434 Element* anchorElement() const override { return nullptr; }
435 bool supportsPressAction() const override;
436 Element* actionElement() const override { return nullptr; }
437 LayoutRect boundingBoxRect() const override { return LayoutRect(); }
438 LayoutRect elementRect() const override = 0;
439 IntPoint clickPoint() override;
440 static IntRect boundingBoxForQuads(RenderObject*, const Vector<FloatQuad>&);
441 Path elementPath() const override { return Path(); }
442 bool supportsPath() const override { return false; }
444 TextIteratorBehaviors textIteratorBehaviorForTextRange() const override;
445 PlainTextRange selectedTextRange() const override { return { }; }
446 int insertionPointLineNumber() const override { return -1; }
448 URL url() const override { return URL(); }
449 VisibleSelection selection() const override { return VisibleSelection(); }
450 String selectedText() const override { return String(); }
451 String accessKey() const override { return nullAtom(); }
452 String localizedActionVerb() const override;
453 String actionVerb() const override;
455 bool isWidget() const override { return false; }
456 Widget* widget() const override { return nullptr; }
457 PlatformWidget platformWidget() const override { return nullptr; }
458 Widget* widgetForAttachmentView() const override { return nullptr; }
461 RemoteAXObjectRef remoteParentObject() const override;
462 FloatRect convertRectToPlatformSpace(const FloatRect&, AccessibilityConversionSpace) const override;
464 Page* page() const override;
465 Document* document() const override;
466 FrameView* documentFrameView() const override;
467 Frame* frame() const override;
468 Frame* mainFrame() const override;
469 Document* topDocument() const override;
470 ScrollView* scrollView() const override { return nullptr; }
471 ScrollView* scrollViewAncestor() const override;
472 String language() const override;
473 // 1-based, to match the aria-level spec.
474 unsigned hierarchicalLevel() const override { return 0; }
475 bool isInlineText() const override;
477 // Ensures that the view is focused and active before attempting to set focus to an AccessibilityObject.
478 // Subclasses that override setFocused should call this base implementation first.
479 void setFocused(bool) override;
481 void setSelectedText(const String&) override { }
482 void setSelectedTextRange(const PlainTextRange&) override { }
483 bool setValue(const String&) override { return false; }
484 bool replaceTextInRange(const String&, const PlainTextRange&) override;
485 bool insertText(const String&) override;
487 bool setValue(float) override { return false; }
488 void setSelected(bool) override { }
489 void setSelectedRows(AccessibilityChildrenVector&) override { }
491 void makeRangeVisible(const PlainTextRange&) override { }
492 bool press() override;
493 bool performDefaultAction() override { return press(); }
495 AccessibilityOrientation orientation() const override;
496 void increment() override { }
497 void decrement() override { }
499 virtual void updateRole() { }
500 bool childrenInitialized() const { return m_childrenInitialized; }
501 const AccessibilityChildrenVector& children(bool updateChildrenIfNeeded = true) override;
502 virtual void addChildren() { }
503 enum class DescendIfIgnored : uint8_t { No, Yes };
504 virtual void addChild(AXCoreObject*, DescendIfIgnored = DescendIfIgnored::Yes);
505 virtual void insertChild(AXCoreObject*, unsigned, DescendIfIgnored = DescendIfIgnored::Yes);
506 virtual bool canHaveChildren() const { return true; }
507 void updateChildrenIfNecessary() override;
508 virtual void setNeedsToUpdateChildren() { }
509 virtual void setNeedsToUpdateSubtree() { }
510 virtual void clearChildren();
511 virtual bool needsToUpdateChildren() const { return false; }
513 void detachFromParent() override;
515 void detachFromParent() override { }
517 bool isDetachedFromParent() override { return false; }
519 bool canHaveSelectedChildren() const override { return false; }
520 void selectedChildren(AccessibilityChildrenVector&) override { }
521 void setSelectedChildren(const AccessibilityChildrenVector&) override { }
522 void visibleChildren(AccessibilityChildrenVector&) override { }
523 void tabChildren(AccessibilityChildrenVector&) override { }
524 bool shouldFocusActiveDescendant() const override { return false; }
525 AccessibilityObject* activeDescendant() const override { return nullptr; }
526 AccessibilityObject* firstAnonymousBlockChild() const override;
528 WEBCORE_EXPORT static AccessibilityRole ariaRoleToWebCoreRole(const String&);
529 virtual bool hasAttribute(const QualifiedName&) const;
530 virtual const AtomString& getAttribute(const QualifiedName&) const;
531 std::optional<String> attributeValue(const String&) const override;
532 int getIntegralAttribute(const QualifiedName&) const;
533 bool hasTagName(const QualifiedName&) const override;
534 AtomString tagName() const override;
535 bool hasDisplayContents() const;
537 VisiblePositionRange visiblePositionRange() const override { return VisiblePositionRange(); }
538 VisiblePositionRange visiblePositionRangeForLine(unsigned) const override { return VisiblePositionRange(); }
540 std::optional<SimpleRange> elementRange() const override;
541 static bool replacedNodeNeedsCharacter(Node* replacedNode);
543 VisiblePositionRange visiblePositionRangeForUnorderedPositions(const VisiblePosition&, const VisiblePosition&) const override;
544 VisiblePositionRange positionOfLeftWord(const VisiblePosition&) const override;
545 VisiblePositionRange positionOfRightWord(const VisiblePosition&) const override;
546 VisiblePositionRange leftLineVisiblePositionRange(const VisiblePosition&) const override;
547 VisiblePositionRange rightLineVisiblePositionRange(const VisiblePosition&) const override;
548 VisiblePositionRange sentenceForPosition(const VisiblePosition&) const override;
549 VisiblePositionRange paragraphForPosition(const VisiblePosition&) const override;
550 VisiblePositionRange styleRangeForPosition(const VisiblePosition&) const override;
551 VisiblePositionRange visiblePositionRangeForRange(const PlainTextRange&) const override;
552 VisiblePositionRange lineRangeForPosition(const VisiblePosition&) const override;
553 VisiblePositionRange selectedVisiblePositionRange() const override { return { }; }
555 std::optional<SimpleRange> rangeForPlainTextRange(const PlainTextRange&) const override;
557 AXTextMarkerRangeRef textMarkerRangeForNSRange(const NSRange&) const override;
560 static String stringForVisiblePositionRange(const VisiblePositionRange&);
561 String stringForRange(const SimpleRange&) const override;
562 IntRect boundsForVisiblePositionRange(const VisiblePositionRange&) const override { return IntRect(); }
563 IntRect boundsForRange(const SimpleRange&) const override { return IntRect(); }
564 int lengthForVisiblePositionRange(const VisiblePositionRange&) const override;
565 void setSelectedVisiblePositionRange(const VisiblePositionRange&) const override { }
567 VisiblePosition visiblePositionForBounds(const IntRect&, AccessibilityVisiblePositionForBounds) const override;
568 VisiblePosition visiblePositionForPoint(const IntPoint&) const override { return VisiblePosition(); }
569 VisiblePosition nextVisiblePosition(const VisiblePosition& visiblePos) const override { return visiblePos.next(); }
570 VisiblePosition previousVisiblePosition(const VisiblePosition& visiblePos) const override { return visiblePos.previous(); }
571 VisiblePosition nextWordEnd(const VisiblePosition&) const override;
572 VisiblePosition previousWordStart(const VisiblePosition&) const override;
573 VisiblePosition nextLineEndPosition(const VisiblePosition&) const override;
574 VisiblePosition previousLineStartPosition(const VisiblePosition&) const override;
575 VisiblePosition nextSentenceEndPosition(const VisiblePosition&) const override;
576 VisiblePosition previousSentenceStartPosition(const VisiblePosition&) const override;
577 VisiblePosition nextParagraphEndPosition(const VisiblePosition&) const override;
578 VisiblePosition previousParagraphStartPosition(const VisiblePosition&) const override;
579 VisiblePosition visiblePositionForIndex(unsigned, bool /*lastIndexOK */) const override { return VisiblePosition(); }
581 VisiblePosition visiblePositionForIndex(int) const override { return VisiblePosition(); }
582 int indexForVisiblePosition(const VisiblePosition&) const override { return 0; }
584 AccessibilityObject* accessibilityObjectForPosition(const VisiblePosition&) const override;
585 int lineForPosition(const VisiblePosition&) const override;
586 PlainTextRange plainTextRangeForVisiblePositionRange(const VisiblePositionRange&) const override;
587 int index(const VisiblePosition&) const override { return -1; }
589 void lineBreaks(Vector<int>&) const override { }
590 PlainTextRange doAXRangeForLine(unsigned) const override { return PlainTextRange(); }
591 PlainTextRange doAXRangeForPosition(const IntPoint&) const override;
592 PlainTextRange doAXRangeForIndex(unsigned) const override { return PlainTextRange(); }
593 PlainTextRange doAXStyleRangeForIndex(unsigned) const override;
595 String doAXStringForRange(const PlainTextRange&) const override { return String(); }
596 IntRect doAXBoundsForRange(const PlainTextRange&) const override { return IntRect(); }
597 IntRect doAXBoundsForRangeUsingCharacterOffset(const PlainTextRange&) const override { return IntRect(); }
598 static StringView listMarkerTextForNodeAndPosition(Node*, const VisiblePosition&);
600 unsigned doAXLineForIndex(unsigned) override;
602 String computedRoleString() const override;
604 String stringValueForMSAA() const override { return String(); }
605 String stringRoleForMSAA() const override { return String(); }
606 String nameForMSAA() const override { return String(); }
607 String descriptionForMSAA() const override { return String(); }
608 AccessibilityRole roleValueForMSAA() const override { return roleValue(); }
610 String passwordFieldValue() const override { return String(); }
611 bool isValueAutofilled() const override;
612 bool isValueAutofillAvailable() const override;
613 AutoFillButtonType valueAutofillButtonType() const override;
615 // Used by an ARIA tree to get all its rows.
616 void ariaTreeRows(AccessibilityChildrenVector&) override;
617 // Used by an ARIA tree item to get only its content, and not its child tree items and groups.
618 AccessibilityChildrenVector ariaTreeItemContent() override;
620 // ARIA live-region features.
621 bool supportsLiveRegion(bool excludeIfOff = true) const override;
622 bool isInsideLiveRegion(bool excludeIfOff = true) const override;
623 AccessibilityObject* liveRegionAncestor(bool excludeIfOff = true) const override;
624 const String liveRegionStatus() const override { return String(); }
625 const String liveRegionRelevant() const override { return nullAtom(); }
626 bool liveRegionAtomic() const override { return false; }
627 bool isBusy() const override { return false; }
628 static const String defaultLiveRegionStatusForRole(AccessibilityRole);
629 static bool liveRegionStatusIsEnabled(const AtomString&);
630 static bool contentEditableAttributeIsEnabled(Element*);
631 bool hasContentEditableAttributeSet() const override;
633 bool supportsReadOnly() const override;
634 String readOnlyValue() const override;
636 bool supportsAutoComplete() const override;
637 String autoCompleteValue() const override;
639 bool hasARIAValueNow() const override { return hasAttribute(HTMLNames::aria_valuenowAttr); }
640 bool supportsARIAAttributes() const override;
642 // CSS3 Speech properties.
643 OptionSet<SpeakAs> speakAsProperty() const override { return OptionSet<SpeakAs> { }; }
645 // Make this object visible by scrolling as many nested scrollable views as needed.
646 void scrollToMakeVisible() const override;
647 // Same, but if the whole object can't be made visible, try for this subrect, in local coordinates.
648 void scrollToMakeVisibleWithSubFocus(const IntRect&) const override;
649 // Scroll this object to a given point in global coordinates of the top-level window.
650 void scrollToGlobalPoint(const IntPoint&) const override;
652 bool scrollByPage(ScrollByPageDirection) const override;
653 IntPoint scrollPosition() const override;
654 AccessibilityChildrenVector contents() override;
655 IntSize scrollContentsSize() const override;
656 IntRect scrollVisibleContentRect() const override;
657 void scrollToMakeVisible(const ScrollRectToVisibleOptions&) const override;
659 bool lastKnownIsIgnoredValue();
660 void setLastKnownIsIgnoredValue(bool);
661 bool hasIgnoredValueChanged();
663 // All math elements return true for isMathElement().
664 bool isMathElement() const override { return false; }
665 bool isMathFraction() const override { return false; }
666 bool isMathFenced() const override { return false; }
667 bool isMathSubscriptSuperscript() const override { return false; }
668 bool isMathRow() const override { return false; }
669 bool isMathUnderOver() const override { return false; }
670 bool isMathRoot() const override { return false; }
671 bool isMathSquareRoot() const override { return false; }
672 bool isMathText() const override { return false; }
673 bool isMathNumber() const override { return false; }
674 bool isMathOperator() const override { return false; }
675 bool isMathFenceOperator() const override { return false; }
676 bool isMathSeparatorOperator() const override { return false; }
677 bool isMathIdentifier() const override { return false; }
678 bool isMathTable() const override { return false; }
679 bool isMathTableRow() const override { return false; }
680 bool isMathTableCell() const override { return false; }
681 bool isMathMultiscript() const override { return false; }
682 bool isMathToken() const override { return false; }
683 bool isMathScriptObject(AccessibilityMathScriptObjectType) const override { return false; }
684 bool isMathMultiscriptObject(AccessibilityMathMultiscriptObjectType) const override { return false; }
687 std::optional<AccessibilityChildrenVector> mathRadicand() override { return std::nullopt; }
688 AXCoreObject* mathRootIndexObject() override { return nullptr; }
690 // Under over components.
691 AXCoreObject* mathUnderObject() override { return nullptr; }
692 AXCoreObject* mathOverObject() override { return nullptr; }
694 // Fraction components.
695 AXCoreObject* mathNumeratorObject() override { return nullptr; }
696 AXCoreObject* mathDenominatorObject() override { return nullptr; }
698 // Subscript/superscript components.
699 AXCoreObject* mathBaseObject() override { return nullptr; }
700 AXCoreObject* mathSubscriptObject() override { return nullptr; }
701 AXCoreObject* mathSuperscriptObject() override { return nullptr; }
703 // Fenced components.
704 String mathFencedOpenString() const override { return String(); }
705 String mathFencedCloseString() const override { return String(); }
706 int mathLineThickness() const override { return 0; }
707 bool isAnonymousMathOperator() const override { return false; }
709 // Multiscripts components.
710 void mathPrescripts(AccessibilityMathMultiscriptPairs&) override { }
711 void mathPostscripts(AccessibilityMathMultiscriptPairs&) override { }
714 bool isAXHidden() const override;
715 bool isDOMHidden() const override;
716 bool isHidden() const override { return isAXHidden() || isDOMHidden(); }
719 void overrideAttachmentParent(AXCoreObject* parent) override;
721 void overrideAttachmentParent(AXCoreObject*) override { }
724 #if ENABLE(ACCESSIBILITY)
725 // a platform-specific method for determining if an attachment is ignored
726 bool accessibilityIgnoreAttachment() const override;
727 // gives platforms the opportunity to indicate if and how an object should be included
728 AccessibilityObjectInclusion accessibilityPlatformIncludesObject() const override;
730 bool accessibilityIgnoreAttachment() const override { return true; }
731 AccessibilityObjectInclusion accessibilityPlatformIncludesObject() const override { return AccessibilityObjectInclusion::DefaultBehavior; }
734 #if PLATFORM(IOS_FAMILY)
735 int accessibilityPasswordFieldLength() override;
736 bool hasTouchEventListener() const override;
737 bool isInputTypePopupButton() const override;
740 // allows for an AccessibilityObject to update its render tree or perform
741 // other operations update type operations
742 void updateBackingStore() override;
745 bool preventKeyboardDOMEventDispatch() const override;
746 void setPreventKeyboardDOMEventDispatch(bool) override;
747 bool fileUploadButtonReturnsValueInTitle() const override;
748 String speechHintAttributeValue() const override;
749 String descriptionAttributeValue() const override;
750 String helpTextAttributeValue() const override;
751 String titleAttributeValue() const override;
752 bool hasApplePDFAnnotationAttribute() const override { return hasAttribute(HTMLNames::x_apple_pdf_annotationAttr); }
756 bool caretBrowsingEnabled() const override;
757 void setCaretBrowsingEnabled(bool) override;
760 AccessibilityObject* focusableAncestor() override;
761 AccessibilityObject* editableAncestor() override;
762 AccessibilityObject* highestEditableAncestor() override;
764 const AccessibilityScrollView* ancestorAccessibilityScrollView(bool includeSelf) const override;
765 AccessibilityObject* webAreaObject() const override { return nullptr; }
767 void clearIsIgnoredFromParentData() override { m_isIgnoredFromParentData = { }; }
768 void setIsIgnoredFromParentDataForChild(AXCoreObject*) override;
770 PAL::SessionID sessionID() const override;
771 String documentURI() const override;
772 String documentEncoding() const override;
773 AccessibilityChildrenVector documentLinks() override { return AccessibilityChildrenVector(); }
775 AccessibilityChildrenVector relatedObjects(AXRelationType) const override;
777 AccessibilityObject() = default;
779 // FIXME: Make more of these member functions private.
781 void detachRemoteParts(AccessibilityDetachmentType) override;
782 void detachPlatformWrapper(AccessibilityDetachmentType) override;
784 void setIsIgnoredFromParentData(AccessibilityIsIgnoredFromParentData& data) override { m_isIgnoredFromParentData = data; }
786 bool isAccessibilityObject() const override { return true; }
788 // If this object itself scrolls, return its ScrollableArea.
789 virtual ScrollableArea* getScrollableAreaIfScrollable() const { return nullptr; }
790 virtual void scrollTo(const IntPoint&) const { }
791 ScrollableArea* scrollableAreaAncestor() const;
792 void scrollAreaAndAncestor(std::pair<ScrollableArea*, AccessibilityObject*>&) const;
794 virtual bool shouldIgnoreAttributeRole() const { return false; }
795 virtual AccessibilityRole buttonRoleType() const;
796 String rolePlatformDescription() const;
797 bool isOnScreen() const override;
798 bool dispatchTouchEvent();
800 static bool isARIAInput(AccessibilityRole);
802 virtual bool exposesTitleUIElement() const { return true; }
803 FloatRect unobscuredContentRect() const override;
804 AccessibilityObject* radioGroupAncestor() const;
806 bool allowsTextRanges() const;
807 unsigned getLengthForTextRange() const;
808 String innerHTML() const override;
809 String outerHTML() const override;
812 bool hasAncestorFlag(AXAncestorFlag flag) const { return ancestorFlagsAreInitialized() && m_ancestorFlags.contains(flag); }
813 std::optional<SimpleRange> rangeOfStringClosestToRangeInDirection(const SimpleRange&, AccessibilitySearchDirection, const Vector<String>&) const;
814 std::optional<SimpleRange> selectionRange() const;
815 std::optional<SimpleRange> findTextRange(const Vector<String>& searchStrings, const SimpleRange& start, AccessibilitySearchTextDirection) const;
816 std::optional<SimpleRange> visibleCharacterRange() const override;
817 std::optional<SimpleRange> visibleCharacterRangeInternal(const std::optional<SimpleRange>&, const FloatRect&, const IntRect&) const;
818 Vector<BoundaryPoint> previousLineStartBoundaryPoints(const VisiblePosition&, const SimpleRange&, unsigned) const;
819 std::optional<VisiblePosition> previousLineStartPositionInternal(const VisiblePosition&) const;
820 bool boundaryPointsContainedInRect(const BoundaryPoint&, const BoundaryPoint&, const FloatRect&) const;
821 std::optional<BoundaryPoint> lastBoundaryPointContainedInRect(const Vector<BoundaryPoint>&, const BoundaryPoint&, const FloatRect&, int, int) const;
822 std::optional<BoundaryPoint> lastBoundaryPointContainedInRect(const Vector<BoundaryPoint>& boundaryPoints, const BoundaryPoint& startBoundaryPoint, const FloatRect& targetRect) const;
824 void ariaTreeRows(AccessibilityChildrenVector& rows, AccessibilityChildrenVector& ancestors);
826 #if PLATFORM(COCOA) && ENABLE(MODEL_ELEMENT)
827 Vector<RetainPtr<id>> modelElementChildren() override;
830 protected: // FIXME: Make the data members private.
831 AccessibilityChildrenVector m_children;
832 mutable bool m_childrenInitialized { false };
833 AccessibilityRole m_role { AccessibilityRole::Unknown };
836 OptionSet<AXAncestorFlag> m_ancestorFlags;
837 AccessibilityObjectInclusion m_lastKnownIsIgnoredValue { AccessibilityObjectInclusion::DefaultBehavior };
838 // std::nullopt is a valid cached value if this object has no visible characters.
839 mutable std::optional<SimpleRange> m_cachedVisibleCharacterRange;
840 // This is std::nullopt if we haven't cached any input yet.
841 mutable std::optional<std::tuple<std::optional<SimpleRange>, FloatRect, IntRect>> m_cachedVisibleCharacterRangeInputs;
842 protected: // FIXME: Make the data members private.
843 // FIXME: This can be replaced by AXAncestorFlags.
844 AccessibilityIsIgnoredFromParentData m_isIgnoredFromParentData;
845 bool m_childrenDirty { false };
846 bool m_subtreeDirty { false };
849 #if ENABLE(ACCESSIBILITY)
850 inline bool AccessibilityObject::hasDisplayContents() const
852 return is<Element>(node()) && downcast<Element>(node())->hasDisplayContents();
855 inline std::optional<BoundaryPoint> AccessibilityObject::lastBoundaryPointContainedInRect(const Vector<BoundaryPoint>& boundaryPoints, const BoundaryPoint& startBoundaryPoint, const FloatRect& targetRect) const
857 return lastBoundaryPointContainedInRect(boundaryPoints, startBoundaryPoint, targetRect, 0, boundaryPoints.size() - 1);
860 inline VisiblePosition AccessibilityObject::previousLineStartPosition(const VisiblePosition& position) const
862 return previousLineStartPositionInternal(position).value_or(VisiblePosition());
865 inline bool AccessibilityObject::hasDisplayContents() const { return false; }
866 inline std::optional<BoundaryPoint> AccessibilityObject::lastBoundaryPointContainedInRect(const Vector<BoundaryPoint>&, const BoundaryPoint&, const FloatRect&) const { return std::nullopt; }
867 inline VisiblePosition AccessibilityObject::previousLineStartPosition(const VisiblePosition&) const { return { }; }
870 #if !ENABLE(ACCESSIBILITY)
871 inline const AccessibilityObject::AccessibilityChildrenVector& AccessibilityObject::children(bool) { return m_children; }
872 inline String AccessibilityObject::localizedActionVerb() const { return emptyString(); }
873 inline String AccessibilityObject::actionVerb() const { return emptyString(); }
874 inline int AccessibilityObject::lineForPosition(const VisiblePosition&) const { return -1; }
875 inline void AccessibilityObject::updateBackingStore() { }
876 inline void AccessibilityObject::detachPlatformWrapper(AccessibilityDetachmentType) { }
879 #if !(ENABLE(ACCESSIBILITY) && USE(ATSPI))
880 inline bool AccessibilityObject::allowsTextRanges() const { return true; }
881 inline unsigned AccessibilityObject::getLengthForTextRange() const { return text().length(); }
884 AccessibilityObject* firstAccessibleObjectFromNode(const Node*, const Function<bool(const AccessibilityObject&)>& isAccessible);
886 namespace Accessibility {
888 using PlatformRoleMap = HashMap<AccessibilityRole, String, DefaultHash<unsigned>, WTF::UnsignedWithZeroKeyHashTraits<unsigned>>;
890 PlatformRoleMap createPlatformRoleMap();
891 String roleToPlatformString(AccessibilityRole);
893 } // namespace Accessibility
895 } // namespace WebCore
897 #define SPECIALIZE_TYPE_TRAITS_ACCESSIBILITY(ToValueTypeName, predicate) \
898 SPECIALIZE_TYPE_TRAITS_BEGIN(WebCore::ToValueTypeName) \
899 static bool isType(const WebCore::AXCoreObject& object) { return object.predicate; } \
900 SPECIALIZE_TYPE_TRAITS_END()
902 SPECIALIZE_TYPE_TRAITS_BEGIN(WebCore::AccessibilityObject)
903 static bool isType(const WebCore::AXCoreObject& context) { return context.isAccessibilityObject(); }
904 SPECIALIZE_TYPE_TRAITS_END()