AX: AXIsolatedTree::updateChildren sometimes fails to update isolated subtrees when...
[WebKit.git] / Source / WebCore / accessibility / AccessibilityObject.h
1 /*
2  * Copyright (C) 2008, 2009, 2011 Apple Inc. All rights reserved.
3  * Copyright (C) 2008 Nuanti Ltd.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  *
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.
17  *
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.
28  */
29
30 #pragma once
31
32 #include "AccessibilityObjectInterface.h"
33 #include "FloatQuad.h"
34 #include "LayoutRect.h"
35 #include "Path.h"
36 #include <wtf/Forward.h>
37 #include <wtf/Function.h>
38 #include <wtf/RefPtr.h>
39 #include <wtf/Vector.h>
40
41 #if PLATFORM(COCOA)
42 #include <wtf/RetainPtr.h>
43 #endif
44
45 #if PLATFORM(COCOA)
46
47 OBJC_CLASS NSArray;
48 OBJC_CLASS NSAttributedString;
49 OBJC_CLASS NSData;
50 OBJC_CLASS NSMutableAttributedString;
51 OBJC_CLASS NSString;
52 OBJC_CLASS NSValue;
53 OBJC_CLASS NSView;
54
55 #endif
56
57 namespace WebCore {
58
59 class AccessibilityObject;
60 class IntPoint;
61 class IntSize;
62 class ScrollableArea;
63
64 struct AccessibilityText {
65     String text;
66     AccessibilityTextSource textSource;
67     
68     AccessibilityText(const String& t, const AccessibilityTextSource& s)
69         : text(t)
70         , textSource(s)
71     { }
72 };
73
74 bool nodeHasPresentationRole(Node*);
75
76 class AccessibilityObject : public AXCoreObject {
77 public:
78     virtual ~AccessibilityObject();
79
80     // After constructing an AccessibilityObject, it must be given a
81     // unique ID, then added to AXObjectCache, and finally init() must
82     // be called last.
83     void setObjectID(AXID id) override { m_id = id; }
84     void init() override { }
85
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; }
90
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;
100
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;
106
107     bool isDetached() const override;
108
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; }
121
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; }
148
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; }
153
154     // Table support.
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; }
172
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; }
183
184     // Table column support.
185     bool isTableColumn() const override { return false; }
186     unsigned columnIndex() const override { return 0; }
187     AXCoreObject* columnHeader() override { return nullptr; }
188
189     // Table row support.
190     bool isTableRow() const override { return false; }
191     unsigned rowIndex() const override { return 0; }
192
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; }
197
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;
223
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;
246     
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; }
249
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;
260
261     bool supportsDatetimeAttribute() const override;
262     String datetimeAttributeValue() const override;
263
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; }
271
272     Element* element() const override;
273     Node* node() const override { return nullptr; }
274     RenderObject* renderer() const override { return nullptr; }
275     const RenderStyle* style() const;
276
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;
283
284     bool isShowingValidationMessage() const override;
285     String validationMessage() const override;
286
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;
302
303     bool supportsARIARoleDescription() const;
304     bool supportsARIAOwns() const override { return false; }
305     bool isActiveDescendantOfFocusedContainer() const override;
306
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;
328
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;
333
334     bool supportsSetSize() const override;
335     bool supportsPosInSet() const override;
336     int setSize() const override;
337     int posInSet() const override;
338
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 { }; }
345
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;
350
351     AXCoreObject* focusedUIElement() const override;
352
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; }
366
367     bool isDescendantOfRole(AccessibilityRole) const override;
368
369     // Text selection
370     Vector<SimpleRange> findTextRanges(const AccessibilitySearchTextCriteria&) const override;
371     Vector<String> performTextOperation(AccessibilityTextOperation const&) override;
372
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; }
379
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; }
384
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;
389
390     // A programmatic way to set a name on an AccessibleObject.
391     void setAccessibleName(const AtomString&) override { }
392     bool hasAttributesRequiredForInclusion() const override;
393
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(); }
398
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; }
413
414     // Abbreviations
415     String expandedTextValue() const override { return String(); }
416     bool supportsExpandedTextValue() const override { return false; }
417
418     Vector<Element*> elementsFromAttribute(const QualifiedName&) const;
419
420     // Only if isColorWell()
421     SRGBA<uint8_t> colorValue() const override { return Color::transparentBlack; }
422
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;
428
429     AXObjectCache* axObjectCache() const override;
430     AXID objectID() const override { return m_id; }
431
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; }
443
444     TextIteratorBehaviors textIteratorBehaviorForTextRange() const override;
445     PlainTextRange selectedTextRange() const override { return { }; }
446     int insertionPointLineNumber() const override { return -1; }
447
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;
454
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; }
459
460 #if PLATFORM(COCOA)
461     RemoteAXObjectRef remoteParentObject() const override;
462     FloatRect convertRectToPlatformSpace(const FloatRect&, AccessibilityConversionSpace) const override;
463 #endif
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;
476
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;
480
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;
486
487     bool setValue(float) override { return false; }
488     void setSelected(bool) override { }
489     void setSelectedRows(AccessibilityChildrenVector&) override { }
490
491     void makeRangeVisible(const PlainTextRange&) override { }
492     bool press() override;
493     bool performDefaultAction() override { return press(); }
494
495     AccessibilityOrientation orientation() const override;
496     void increment() override { }
497     void decrement() override { }
498
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; }
512 #if PLATFORM(COCOA)
513     void detachFromParent() override;
514 #else
515     void detachFromParent() override { }
516 #endif
517     bool isDetachedFromParent() override { return false; }
518
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;
527
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;
536
537     VisiblePositionRange visiblePositionRange() const override { return VisiblePositionRange(); }
538     VisiblePositionRange visiblePositionRangeForLine(unsigned) const override { return VisiblePositionRange(); }
539
540     std::optional<SimpleRange> elementRange() const override;
541     static bool replacedNodeNeedsCharacter(Node* replacedNode);
542
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 { }; }
554
555     std::optional<SimpleRange> rangeForPlainTextRange(const PlainTextRange&) const override;
556 #if PLATFORM(MAC)
557     AXTextMarkerRangeRef textMarkerRangeForNSRange(const NSRange&) const override;
558 #endif
559
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 { }
566
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(); }
580
581     VisiblePosition visiblePositionForIndex(int) const override { return VisiblePosition(); }
582     int indexForVisiblePosition(const VisiblePosition&) const override { return 0; }
583
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; }
588
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;
594
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&);
599
600     unsigned doAXLineForIndex(unsigned) override;
601
602     String computedRoleString() const override;
603
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(); }
609
610     String passwordFieldValue() const override { return String(); }
611     bool isValueAutofilled() const override;
612     bool isValueAutofillAvailable() const override;
613     AutoFillButtonType valueAutofillButtonType() const override;
614
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;
619
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;
632
633     bool supportsReadOnly() const override;
634     String readOnlyValue() const override;
635
636     bool supportsAutoComplete() const override;
637     String autoCompleteValue() const override;
638
639     bool hasARIAValueNow() const override { return hasAttribute(HTMLNames::aria_valuenowAttr); }
640     bool supportsARIAAttributes() const override;
641
642     // CSS3 Speech properties.
643     OptionSet<SpeakAs> speakAsProperty() const override { return OptionSet<SpeakAs> { }; }
644
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;
651
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;
658
659     bool lastKnownIsIgnoredValue();
660     void setLastKnownIsIgnoredValue(bool);
661     bool hasIgnoredValueChanged();
662
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; }
685
686     // Root components.
687     std::optional<AccessibilityChildrenVector> mathRadicand() override { return std::nullopt; }
688     AXCoreObject* mathRootIndexObject() override { return nullptr; }
689
690     // Under over components.
691     AXCoreObject* mathUnderObject() override { return nullptr; }
692     AXCoreObject* mathOverObject() override { return nullptr; }
693
694     // Fraction components.
695     AXCoreObject* mathNumeratorObject() override { return nullptr; }
696     AXCoreObject* mathDenominatorObject() override { return nullptr; }
697
698     // Subscript/superscript components.
699     AXCoreObject* mathBaseObject() override { return nullptr; }
700     AXCoreObject* mathSubscriptObject() override { return nullptr; }
701     AXCoreObject* mathSuperscriptObject() override { return nullptr; }
702
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; }
708
709     // Multiscripts components.
710     void mathPrescripts(AccessibilityMathMultiscriptPairs&) override { }
711     void mathPostscripts(AccessibilityMathMultiscriptPairs&) override { }
712
713     // Visibility.
714     bool isAXHidden() const override;
715     bool isDOMHidden() const override;
716     bool isHidden() const override { return isAXHidden() || isDOMHidden(); }
717
718 #if PLATFORM(COCOA)
719     void overrideAttachmentParent(AXCoreObject* parent) override;
720 #else
721     void overrideAttachmentParent(AXCoreObject*) override { }
722 #endif
723
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;
729 #else
730     bool accessibilityIgnoreAttachment() const override { return true; }
731     AccessibilityObjectInclusion accessibilityPlatformIncludesObject() const override { return AccessibilityObjectInclusion::DefaultBehavior; }
732 #endif
733
734 #if PLATFORM(IOS_FAMILY)
735     int accessibilityPasswordFieldLength() override;
736     bool hasTouchEventListener() const override;
737     bool isInputTypePopupButton() const override;
738 #endif
739
740     // allows for an AccessibilityObject to update its render tree or perform
741     // other operations update type operations
742     void updateBackingStore() override;
743
744 #if PLATFORM(COCOA)
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); }
753 #endif
754
755 #if PLATFORM(MAC)
756     bool caretBrowsingEnabled() const override;
757     void setCaretBrowsingEnabled(bool) override;
758 #endif
759
760     AccessibilityObject* focusableAncestor() override;
761     AccessibilityObject* editableAncestor() override;
762     AccessibilityObject* highestEditableAncestor() override;
763
764     const AccessibilityScrollView* ancestorAccessibilityScrollView(bool includeSelf) const override;
765     AccessibilityObject* webAreaObject() const override { return nullptr; }
766
767     void clearIsIgnoredFromParentData() override { m_isIgnoredFromParentData = { }; }
768     void setIsIgnoredFromParentDataForChild(AXCoreObject*) override;
769
770     PAL::SessionID sessionID() const override;
771     String documentURI() const override;
772     String documentEncoding() const override;
773     AccessibilityChildrenVector documentLinks() override { return AccessibilityChildrenVector(); }
774
775     AccessibilityChildrenVector relatedObjects(AXRelationType) const override;
776 protected:
777     AccessibilityObject() = default;
778
779     // FIXME: Make more of these member functions private.
780
781     void detachRemoteParts(AccessibilityDetachmentType) override;
782     void detachPlatformWrapper(AccessibilityDetachmentType) override;
783
784     void setIsIgnoredFromParentData(AccessibilityIsIgnoredFromParentData& data) override { m_isIgnoredFromParentData = data; }
785
786     bool isAccessibilityObject() const override { return true; }
787
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;
793
794     virtual bool shouldIgnoreAttributeRole() const { return false; }
795     virtual AccessibilityRole buttonRoleType() const;
796     String rolePlatformDescription() const;
797     bool isOnScreen() const override;
798     bool dispatchTouchEvent();
799
800     static bool isARIAInput(AccessibilityRole);
801
802     virtual bool exposesTitleUIElement() const { return true; }
803     FloatRect unobscuredContentRect() const override;
804     AccessibilityObject* radioGroupAncestor() const;
805
806     bool allowsTextRanges() const;
807     unsigned getLengthForTextRange() const;
808     String innerHTML() const override;
809     String outerHTML() const override;
810
811 private:
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;
823
824     void ariaTreeRows(AccessibilityChildrenVector& rows, AccessibilityChildrenVector& ancestors);
825     
826 #if PLATFORM(COCOA) && ENABLE(MODEL_ELEMENT)
827     Vector<RetainPtr<id>> modelElementChildren() override;
828 #endif
829     
830 protected: // FIXME: Make the data members private.
831     AccessibilityChildrenVector m_children;
832     mutable bool m_childrenInitialized { false };
833     AccessibilityRole m_role { AccessibilityRole::Unknown };
834 private:
835     AXID m_id;
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 };
847 };
848
849 #if ENABLE(ACCESSIBILITY)
850 inline bool AccessibilityObject::hasDisplayContents() const
851 {
852     return is<Element>(node()) && downcast<Element>(node())->hasDisplayContents();
853 }
854
855 inline std::optional<BoundaryPoint> AccessibilityObject::lastBoundaryPointContainedInRect(const Vector<BoundaryPoint>& boundaryPoints, const BoundaryPoint& startBoundaryPoint, const FloatRect& targetRect) const
856 {
857     return lastBoundaryPointContainedInRect(boundaryPoints, startBoundaryPoint, targetRect, 0, boundaryPoints.size() - 1);
858 }
859
860 inline VisiblePosition AccessibilityObject::previousLineStartPosition(const VisiblePosition& position) const
861 {
862     return previousLineStartPositionInternal(position).value_or(VisiblePosition());
863 }
864 #else
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 { }; }
868 #endif
869
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) { }
877 #endif
878
879 #if !(ENABLE(ACCESSIBILITY) && USE(ATSPI))
880 inline bool AccessibilityObject::allowsTextRanges() const { return true; }
881 inline unsigned AccessibilityObject::getLengthForTextRange() const { return text().length(); }
882 #endif
883
884 AccessibilityObject* firstAccessibleObjectFromNode(const Node*, const Function<bool(const AccessibilityObject&)>& isAccessible);
885
886 namespace Accessibility {
887
888 using PlatformRoleMap = HashMap<AccessibilityRole, String, DefaultHash<unsigned>, WTF::UnsignedWithZeroKeyHashTraits<unsigned>>;
889
890 PlatformRoleMap createPlatformRoleMap();
891 String roleToPlatformString(AccessibilityRole);
892
893 } // namespace Accessibility
894
895 } // namespace WebCore
896
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()
901
902 SPECIALIZE_TYPE_TRAITS_BEGIN(WebCore::AccessibilityObject)
903 static bool isType(const WebCore::AXCoreObject& context) { return context.isAccessibilityObject(); }
904 SPECIALIZE_TYPE_TRAITS_END()