Fix for LayoutTests/accessibility/mac/search-text/search-text.html in IsolatedTree...
[WebKit-https.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 "Range.h"
37 #include <wtf/Forward.h>
38 #include <wtf/Function.h>
39 #include <wtf/RefPtr.h>
40 #include <wtf/Vector.h>
41
42 #if PLATFORM(COCOA)
43 #include <wtf/RetainPtr.h>
44 #endif
45
46 #if USE(ATK)
47 #include <wtf/glib/GRefPtr.h>
48 #endif
49
50 #if PLATFORM(COCOA)
51
52 OBJC_CLASS NSArray;
53 OBJC_CLASS NSAttributedString;
54 OBJC_CLASS NSData;
55 OBJC_CLASS NSMutableAttributedString;
56 OBJC_CLASS NSString;
57 OBJC_CLASS NSValue;
58 OBJC_CLASS NSView;
59
60 #endif
61
62 namespace WebCore {
63
64 class AccessibilityObject;
65 class IntPoint;
66 class IntSize;
67 class ScrollableArea;
68
69 struct AccessibilityText {
70     String text;
71     AccessibilityTextSource textSource;
72     Vector<RefPtr<AXCoreObject>> textElements;
73     
74     AccessibilityText(const String& t, const AccessibilityTextSource& s)
75         : text(t)
76         , textSource(s)
77     { }
78
79     AccessibilityText(const String& t, const AccessibilityTextSource& s, Vector<AXCoreObject*> elements)
80         : text(t)
81         , textSource(s)
82     {
83         textElements.reserveCapacity(elements.size());
84         for (auto element : elements)
85             textElements.uncheckedAppend(element);
86     }
87
88     AccessibilityText(const String& t, const AccessibilityTextSource& s, AXCoreObject* element)
89         : text(t)
90         , textSource(s)
91     {
92         textElements.append(element);
93     }
94 };
95
96 bool nodeHasPresentationRole(Node*);
97
98 class AccessibilityObject : public AXCoreObject {
99 public:
100     virtual ~AccessibilityObject();
101
102     // After constructing an AccessibilityObject, it must be given a
103     // unique ID, then added to AXObjectCache, and finally init() must
104     // be called last.
105     void setObjectID(AXID id) override { m_id = id; }
106     void init() override { }
107
108     bool isDetached() const override;
109
110     bool isAccessibilityNodeObject() const override { return false; }
111     bool isAccessibilityRenderObject() const override { return false; }
112     bool isAccessibilityScrollbar() const override { return false; }
113     bool isAccessibilityScrollView() 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 isAccessibilityProgressIndicatorInstance() const override { return false; }
118
119     bool isAccessibilityTableColumnInstance() const override { return false; }
120
121     bool isAttachmentElement() const override { return false; }
122     bool isHeading() const override { return false; }
123     bool isLink() const override { return false; }
124     bool isImage() 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 isNativeListBox() const override { return false; }
133     bool isListBoxOption() const override { return false; }
134     bool isAttachment() const override { return false; }
135     bool isMediaTimeline() const override { return false; }
136     bool isMenuRelated() const override { return false; }
137     bool isMenu() const override { return false; }
138     bool isMenuBar() const override { return false; }
139     bool isMenuButton() const override { return false; }
140     bool isMenuItem() const override { return false; }
141     bool isFileUploadButton() const override { return false; }
142     bool isInputImage() const override { return false; }
143     bool isProgressIndicator() const override { return false; }
144     bool isSlider() const override { return false; }
145     bool isSliderThumb() const override { return false; }
146     bool isInputSlider() const override { return false; }
147     bool isControl() const override { return false; }
148     bool isLabel() const override { return false; }
149
150     bool isList() const override { return false; }
151     bool isUnorderedList() const override { return false; }
152     bool isOrderedList() const override { return false; }
153     bool isDescriptionList() const override { return false; }
154
155     // Table support.
156     bool isTable() const override { return false; }
157     bool isExposable() const override { return true; }
158     bool isDataTable() const override { return false; }
159     int tableLevel() const override { return 0; }
160     bool supportsSelectedRows() const override { return false; }
161     AccessibilityChildrenVector columns() override { return AccessibilityChildrenVector(); }
162     AccessibilityChildrenVector rows() override { return AccessibilityChildrenVector(); }
163     unsigned columnCount() override { return 0; }
164     unsigned rowCount() override { return 0; }
165     AccessibilityChildrenVector cells() override { return AccessibilityChildrenVector(); }
166     AXCoreObject* cellForColumnAndRow(unsigned, unsigned) override { return nullptr; }
167     AccessibilityChildrenVector columnHeaders() override { return AccessibilityChildrenVector(); }
168     AccessibilityChildrenVector rowHeaders() override { return AccessibilityChildrenVector(); }
169     AccessibilityChildrenVector visibleRows() override { return AccessibilityChildrenVector(); }
170     AXCoreObject* headerContainer() override { return nullptr; }
171     int axColumnCount() const override { return 0; }
172     int axRowCount() const override { return 0; }
173
174     // Table cell support.
175     bool isTableCell() const override { return false; }
176     // Returns the start location and row span of the cell.
177     std::pair<unsigned, unsigned> rowIndexRange() const override { return { 0, 1 }; }
178     // Returns the start location and column span of the cell.
179     std::pair<unsigned, unsigned> columnIndexRange() const override { return { 0, 1 }; }
180     int axColumnIndex() const override { return -1; }
181     int axRowIndex() const override { return -1; }
182
183     // Table column support.
184     bool isTableColumn() const override { return false; }
185     unsigned columnIndex() const override { return 0; }
186     AXCoreObject* columnHeader() override { return nullptr; }
187
188     // Table row support.
189     bool isTableRow() const override { return false; }
190     unsigned rowIndex() const override { return 0; }
191
192     // ARIA tree/grid row support.
193     bool isARIATreeGridRow() const override { return false; }
194     AccessibilityChildrenVector disclosedRows() override; // ARIATreeItem implementation. AccessibilityARIAGridRow overrides this method.
195     AXCoreObject* disclosedByRow() const override { return nullptr; }
196
197     bool isFieldset() const override { return false; }
198     bool isGroup() const override { return false; }
199     bool isImageMapLink() const override { return false; }
200     bool isMenuList() const override { return false; }
201     bool isMenuListPopup() const override { return false; }
202     bool isMenuListOption() const override { return false; }
203     bool isNativeSpinButton() const override { return false; }
204     AXCoreObject* incrementButton() override { return nullptr; }
205     AXCoreObject* decrementButton() override { return nullptr; }
206     bool isSpinButtonPart() const override { return false; }
207     bool isIncrementor() const override { return false; }
208     bool isMockObject() const override { return false; }
209     virtual bool isMediaControlLabel() const { return false; }
210     bool isMediaObject() const override { return false; }
211     bool isTextControl() const override;
212     bool isARIATextControl() const override;
213     bool isNonNativeTextControl() const override;
214     bool isButton() const override;
215     bool isBlockquote() 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
246     // In a multi-select list, many items can be selected but only one is active at a time.
247     bool isSelectedOptionActive() const override { return false; }
248
249     bool hasBoldFont() const override { return false; }
250     bool hasItalicFont() const override { return false; }
251     bool hasMisspelling() const override;
252     RefPtr<Range> getMisspellingRange(RefPtr<Range> const& start, AccessibilitySearchDirection) const override;
253     bool hasPlainText() const override { return false; }
254     bool hasSameFont(RenderObject*) const override { return false; }
255     bool hasSameFontColor(RenderObject*) const override { return false; }
256     bool hasSameStyle(RenderObject*) const override { return false; }
257     bool hasUnderline() const override { return false; }
258     bool hasHighlighting() const override;
259
260     bool supportsDatetimeAttribute() const override;
261     String datetimeAttributeValue() const override;
262
263     bool canSetFocusAttribute() const override { return false; }
264     bool canSetTextRangeAttributes() const override { return false; }
265     bool canSetValueAttribute() const override { return false; }
266     bool canSetNumericValue() const override { return false; }
267     bool canSetSelectedAttribute() const override { return false; }
268     bool canSetSelectedChildrenAttribute() const override { return false; }
269     bool canSetExpandedAttribute() const override { return false; }
270
271     Element* element() const override;
272     Node* node() const override { return nullptr; }
273     RenderObject* renderer() const override { return nullptr; }
274     bool accessibilityIsIgnored() const override;
275     AccessibilityObjectInclusion defaultObjectInclusion() const override;
276     bool accessibilityIsIgnoredByDefault() const override;
277
278     bool isShowingValidationMessage() const override;
279     String validationMessage() const override;
280
281     unsigned blockquoteLevel() const override;
282     int headingLevel() const override { return 0; }
283     AccessibilityButtonState checkboxOrRadioValue() const override;
284     String valueDescription() const override { return String(); }
285     float valueForRange() const override { return 0.0f; }
286     float maxValueForRange() const override { return 0.0f; }
287     float minValueForRange() const override { return 0.0f; }
288     float stepValueForRange() const override { return 0.0f; }
289     AXCoreObject* selectedRadioButton() override { return nullptr; }
290     AXCoreObject* selectedTabItem() override { return nullptr; }
291     AXCoreObject* selectedListItem() override;
292     int layoutCount() const override { return 0; }
293     double estimatedLoadingProgress() const override { return 0; }
294     WEBCORE_EXPORT static bool isARIAControl(AccessibilityRole);
295     WEBCORE_EXPORT static bool isARIAInput(AccessibilityRole);
296
297     bool supportsARIAOwns() const override { return false; }
298     bool isActiveDescendantOfFocusedContainer() const override;
299     void ariaActiveDescendantReferencingElements(AccessibilityChildrenVector&) const override;
300     void ariaControlsElements(AccessibilityChildrenVector&) const override;
301     void ariaControlsReferencingElements(AccessibilityChildrenVector&) const override;
302     void ariaDescribedByElements(AccessibilityChildrenVector&) const override;
303     void ariaDescribedByReferencingElements(AccessibilityChildrenVector&) const override;
304     void ariaDetailsElements(AccessibilityChildrenVector&) const override;
305     void ariaDetailsReferencingElements(AccessibilityChildrenVector&) const override;
306     void ariaErrorMessageElements(AccessibilityChildrenVector&) const override;
307     void ariaErrorMessageReferencingElements(AccessibilityChildrenVector&) const override;
308     void ariaFlowToElements(AccessibilityChildrenVector&) const override;
309     void ariaFlowToReferencingElements(AccessibilityChildrenVector&) const override;
310     void ariaLabelledByElements(AccessibilityChildrenVector&) const override;
311     void ariaLabelledByReferencingElements(AccessibilityChildrenVector&) const override;
312     void ariaOwnsElements(AccessibilityChildrenVector&) const override;
313     void ariaOwnsReferencingElements(AccessibilityChildrenVector&) const override;
314
315     bool hasPopup() const override { return false; }
316     String popupValue() const override;
317     bool hasDatalist() const override;
318     bool supportsHasPopup() const override;
319     bool pressedIsPresent() const override;
320     bool ariaIsMultiline() const override;
321     String invalidStatus() const override;
322     bool supportsPressed() const override;
323     bool supportsExpanded() const override;
324     bool supportsChecked() const override;
325     AccessibilitySortDirection sortDirection() const override;
326     bool canvasHasFallbackContent() const override { return false; }
327     bool supportsRangeValue() const override;
328     String identifierAttribute() const override;
329     String linkRelValue() const override;
330     void classList(Vector<String>&) const override;
331     AccessibilityCurrentState currentState() const override;
332     String currentValue() const override;
333     bool supportsCurrent() const override;
334     const String keyShortcutsValue() const override;
335
336     // This function checks if the object should be ignored when there's a modal dialog displayed.
337     bool ignoredFromModalPresence() const override;
338     bool isModalDescendant(Node*) const override;
339     bool isModalNode() const override;
340
341     bool supportsSetSize() const override;
342     bool supportsPosInSet() const override;
343     int setSize() const override;
344     int posInSet() const override;
345
346     // ARIA drag and drop
347     bool supportsARIADropping() const override { return false; }
348     bool supportsARIADragging() const override { return false; }
349     bool isARIAGrabbed() override { return false; }
350     void setARIAGrabbed(bool) override { }
351     Vector<String> determineARIADropEffects() override { return { }; }
352
353     // Called on the root AX object to return the deepest available element.
354     AXCoreObject* accessibilityHitTest(const IntPoint&) const override { return nullptr; }
355     // Called on the AX object after the render tree determines which is the right AccessibilityRenderObject.
356     AXCoreObject* elementAccessibilityHitTest(const IntPoint&) const override;
357
358     AXCoreObject* focusedUIElement() const override;
359
360     AccessibilityObject* firstChild() const override { return nullptr; }
361     AccessibilityObject* lastChild() const override { return nullptr; }
362     AccessibilityObject* previousSibling() const override { return nullptr; }
363     AccessibilityObject* nextSibling() const override { return nullptr; }
364     AccessibilityObject* nextSiblingUnignored(int limit) const override;
365     AccessibilityObject* previousSiblingUnignored(int limit) const override;
366     AccessibilityObject* parentObject() const override { return nullptr; }
367     AXCoreObject* parentObjectUnignored() const override;
368     AccessibilityObject* parentObjectIfExists() const override { return nullptr; }
369     static AccessibilityObject* firstAccessibleObjectFromNode(const Node*);
370     void findMatchingObjects(AccessibilitySearchCriteria*, AccessibilityChildrenVector&) override;
371     bool isDescendantOfBarrenParent() const override { return false; }
372
373     bool isDescendantOfRole(AccessibilityRole) const override;
374
375     // Text selection
376 private:
377     RefPtr<Range> rangeOfStringClosestToRangeInDirection(Range*, AccessibilitySearchDirection, Vector<String> const&) const;
378     RefPtr<Range> selectionRange() const;
379     RefPtr<Range> findTextRange(Vector<String> const& searchStrings, RefPtr<Range> const& start, AccessibilitySearchTextDirection) const;
380 public:
381     Vector<RefPtr<Range>> findTextRanges(AccessibilitySearchTextCriteria const&) const override;
382     Vector<String> performTextOperation(AccessibilityTextOperation const&) override;
383
384     AccessibilityObject* observableObject() const override { return nullptr; }
385     void linkedUIElements(AccessibilityChildrenVector&) const override { }
386     AccessibilityObject* titleUIElement() const override { return nullptr; }
387     bool exposesTitleUIElement() const override { return true; }
388     AccessibilityObject* correspondingLabelForControlElement() const override { return nullptr; }
389     AccessibilityObject* correspondingControlForLabelElement() const override { return nullptr; }
390     AccessibilityObject* scrollBar(AccessibilityOrientation) override { return nullptr; }
391
392     AccessibilityRole ariaRoleAttribute() const override { return AccessibilityRole::Unknown; }
393     bool isPresentationalChildOfAriaRole() const override { return false; }
394     bool ariaRoleHasPresentationalChildren() const override { return false; }
395     bool inheritsPresentationalRole() const override { return false; }
396
397     // Accessibility Text
398     void accessibilityText(Vector<AccessibilityText>&) const override { };
399     // A single method for getting a computed label for an AXObject. It condenses the nuances of accessibilityText. Used by Inspector.
400     String computedLabel() override;
401
402     // A programmatic way to set a name on an AccessibleObject.
403     void setAccessibleName(const AtomString&) override { }
404     bool hasAttributesRequiredForInclusion() const override;
405
406     // Accessibility Text - (To be deprecated).
407     String accessibilityDescription() const override { return String(); }
408     String title() const override { return String(); }
409     String helpText() const override { return String(); }
410
411     // Methods for determining accessibility text.
412     bool isARIAStaticText() const override { return ariaRoleAttribute() == AccessibilityRole::StaticText; }
413     String stringValue() const override { return String(); }
414     String textUnderElement(AccessibilityTextUnderElementMode = AccessibilityTextUnderElementMode()) const override { return String(); }
415     String text() const override { return String(); }
416     int textLength() const override { return 0; }
417     String ariaLabeledByAttribute() const override { return String(); }
418     String ariaDescribedByAttribute() const override { return String(); }
419     const String placeholderValue() const override;
420     bool accessibleNameDerivesFromContent() const override;
421
422     // Abbreviations
423     String expandedTextValue() const override { return String(); }
424     bool supportsExpandedTextValue() const override { return false; }
425
426     void elementsFromAttribute(Vector<Element*>&, const QualifiedName&) const override;
427
428     // Only if isColorWell()
429     void colorValue(int& r, int& g, int& b) const override { r = 0; g = 0; b = 0; }
430
431     AccessibilityRole roleValue() const override { return m_role; }
432     String rolePlatformString() const override;
433     String roleDescription() const override;
434     String ariaLandmarkRoleDescription() const override;
435
436     AXObjectCache* axObjectCache() const override;
437     AXID objectID() const override { return m_id; }
438
439     static AccessibilityObject* anchorElementForNode(Node*);
440     static AccessibilityObject* headingElementForNode(Node*);
441     Element* anchorElement() const override { return nullptr; }
442     bool supportsPressAction() const override;
443     Element* actionElement() const override { return nullptr; }
444     LayoutRect boundingBoxRect() const override { return LayoutRect(); }
445     LayoutRect elementRect() const override = 0;
446     IntPoint clickPoint() override;
447     static IntRect boundingBoxForQuads(RenderObject*, const Vector<FloatQuad>&);
448     Path elementPath() const override { return Path(); }
449     bool supportsPath() const override { return false; }
450
451     TextIteratorBehavior textIteratorBehaviorForTextRange() const override;
452     PlainTextRange selectedTextRange() const override { return PlainTextRange(); }
453     unsigned selectionStart() const override { return selectedTextRange().start; }
454     unsigned selectionEnd() const override { return selectedTextRange().length; }
455
456     URL url() const override { return URL(); }
457     VisibleSelection selection() const override { return VisibleSelection(); }
458     String selectedText() const override { return String(); }
459     String accessKey() const override { return nullAtom(); }
460     String actionVerb() const override;
461     Widget* widget() const override { return nullptr; }
462     Widget* widgetForAttachmentView() const override { return nullptr; }
463     Page* page() const override;
464     Document* document() const override;
465     FrameView* documentFrameView() const override;
466     Frame* frame() const override;
467     Frame* mainFrame() const override;
468     Document* topDocument() const override;
469     ScrollView* scrollViewAncestor() const override;
470     String language() const override;
471     // 1-based, to match the aria-level spec.
472     unsigned hierarchicalLevel() const override { return 0; }
473     bool isInlineText() const override;
474
475     void setFocused(bool) override { }
476     void setSelectedText(const String&) override { }
477     void setSelectedTextRange(const PlainTextRange&) override { }
478     void setValue(const String&) override { }
479     bool replaceTextInRange(const String&, const PlainTextRange&) override;
480     bool insertText(const String&) override;
481
482     void setValue(float) override { }
483     void setSelected(bool) override { }
484     void setSelectedRows(AccessibilityChildrenVector&) override { }
485
486     void makeRangeVisible(const PlainTextRange&) override { }
487     bool press() override;
488     bool performDefaultAction() override { return press(); }
489
490     AccessibilityOrientation orientation() const override;
491     void increment() override { }
492     void decrement() override { }
493
494     void childrenChanged() override { }
495     void textChanged() override { }
496     void updateAccessibilityRole() override { }
497     const AccessibilityChildrenVector& children(bool updateChildrenIfNeeded = true) override;
498     void addChildren() override { }
499     void addChild(AXCoreObject*) override;
500     void insertChild(AXCoreObject*, unsigned) override;
501
502     bool shouldIgnoreAttributeRole() const override { return false; }
503
504     bool canHaveChildren() const override { return true; }
505     bool hasChildren() const override { return m_haveChildren; }
506     void updateChildrenIfNecessary() override;
507     void setNeedsToUpdateChildren() override { }
508     void setNeedsToUpdateSubtree() override { }
509     void clearChildren() override;
510     bool needsToUpdateChildren() const override { return false; }
511 #if PLATFORM(COCOA)
512     void detachFromParent() override;
513 #else
514     void detachFromParent() override { }
515 #endif
516     bool isDetachedFromParent() override { return false; }
517
518     bool canHaveSelectedChildren() const override { return false; }
519     void selectedChildren(AccessibilityChildrenVector&) override { }
520     void visibleChildren(AccessibilityChildrenVector&) override { }
521     void tabChildren(AccessibilityChildrenVector&) override { }
522     bool shouldFocusActiveDescendant() const override { return false; }
523     AccessibilityObject* activeDescendant() const override { return nullptr; }
524     void handleActiveDescendantChanged() override { }
525     void handleAriaExpandedChanged() override { }
526     AccessibilityObject* firstAnonymousBlockChild() const override;
527
528     WEBCORE_EXPORT static AccessibilityRole ariaRoleToWebCoreRole(const String&);
529     bool hasAttribute(const QualifiedName&) const override;
530     const AtomString& getAttribute(const QualifiedName&) const override;
531     bool hasTagName(const QualifiedName&) const override;
532     String tagName() const override;
533
534     VisiblePositionRange visiblePositionRange() const override { return VisiblePositionRange(); }
535     VisiblePositionRange visiblePositionRangeForLine(unsigned) const override { return VisiblePositionRange(); }
536
537     RefPtr<Range> elementRange() const override;
538     static bool replacedNodeNeedsCharacter(Node* replacedNode);
539
540     VisiblePositionRange visiblePositionRangeForUnorderedPositions(const VisiblePosition&, const VisiblePosition&) const override;
541     VisiblePositionRange positionOfLeftWord(const VisiblePosition&) const override;
542     VisiblePositionRange positionOfRightWord(const VisiblePosition&) const override;
543     VisiblePositionRange leftLineVisiblePositionRange(const VisiblePosition&) const override;
544     VisiblePositionRange rightLineVisiblePositionRange(const VisiblePosition&) const override;
545     VisiblePositionRange sentenceForPosition(const VisiblePosition&) const override;
546     VisiblePositionRange paragraphForPosition(const VisiblePosition&) const override;
547     VisiblePositionRange styleRangeForPosition(const VisiblePosition&) const override;
548     VisiblePositionRange visiblePositionRangeForRange(const PlainTextRange&) const override;
549     VisiblePositionRange lineRangeForPosition(const VisiblePosition&) const override;
550
551     RefPtr<Range> rangeForPlainTextRange(const PlainTextRange&) const override;
552
553     static String stringForVisiblePositionRange(const VisiblePositionRange&);
554     String stringForRange(RefPtr<Range>) const override;
555     IntRect boundsForVisiblePositionRange(const VisiblePositionRange&) const override { return IntRect(); }
556     IntRect boundsForRange(const RefPtr<Range>) const override { return IntRect(); }
557     int lengthForVisiblePositionRange(const VisiblePositionRange&) const override;
558     void setSelectedVisiblePositionRange(const VisiblePositionRange&) const override { }
559
560     VisiblePosition visiblePositionForBounds(const IntRect&, AccessibilityVisiblePositionForBounds) const override;
561     VisiblePosition visiblePositionForPoint(const IntPoint&) const override { return VisiblePosition(); }
562     VisiblePosition nextVisiblePosition(const VisiblePosition& visiblePos) const override { return visiblePos.next(); }
563     VisiblePosition previousVisiblePosition(const VisiblePosition& visiblePos) const override { return visiblePos.previous(); }
564     VisiblePosition nextWordEnd(const VisiblePosition&) const override;
565     VisiblePosition previousWordStart(const VisiblePosition&) const override;
566     VisiblePosition nextLineEndPosition(const VisiblePosition&) const override;
567     VisiblePosition previousLineStartPosition(const VisiblePosition&) const override;
568     VisiblePosition nextSentenceEndPosition(const VisiblePosition&) const override;
569     VisiblePosition previousSentenceStartPosition(const VisiblePosition&) const override;
570     VisiblePosition nextParagraphEndPosition(const VisiblePosition&) const override;
571     VisiblePosition previousParagraphStartPosition(const VisiblePosition&) const override;
572     VisiblePosition visiblePositionForIndex(unsigned, bool /*lastIndexOK */) const override { return VisiblePosition(); }
573
574     VisiblePosition visiblePositionForIndex(int) const override { return VisiblePosition(); }
575     int indexForVisiblePosition(const VisiblePosition&) const override { return 0; }
576
577     AccessibilityObject* accessibilityObjectForPosition(const VisiblePosition&) const override;
578     int lineForPosition(const VisiblePosition&) const override;
579     PlainTextRange plainTextRangeForVisiblePositionRange(const VisiblePositionRange&) const override;
580     int index(const VisiblePosition&) const override { return -1; }
581
582     void lineBreaks(Vector<int>&) const override { }
583     PlainTextRange doAXRangeForLine(unsigned) const override { return PlainTextRange(); }
584     PlainTextRange doAXRangeForPosition(const IntPoint&) const override;
585     PlainTextRange doAXRangeForIndex(unsigned) const override { return PlainTextRange(); }
586     PlainTextRange doAXStyleRangeForIndex(unsigned) const override;
587
588     String doAXStringForRange(const PlainTextRange&) const override { return String(); }
589     IntRect doAXBoundsForRange(const PlainTextRange&) const override { return IntRect(); }
590     IntRect doAXBoundsForRangeUsingCharacterOffset(const PlainTextRange&) const override { return IntRect(); }
591     static String listMarkerTextForNodeAndPosition(Node*, const VisiblePosition&);
592
593     unsigned doAXLineForIndex(unsigned) override;
594
595     String computedRoleString() const override;
596
597     String stringValueForMSAA() const override { return String(); }
598     String stringRoleForMSAA() const override { return String(); }
599     String nameForMSAA() const override { return String(); }
600     String descriptionForMSAA() const override { return String(); }
601     AccessibilityRole roleValueForMSAA() const override { return roleValue(); }
602
603     String passwordFieldValue() const override { return String(); }
604     bool isValueAutofilled() const override;
605     bool isValueAutofillAvailable() const override;
606     AutoFillButtonType valueAutofillButtonType() const override;
607
608     // Used by an ARIA tree to get all its rows.
609     void ariaTreeRows(AccessibilityChildrenVector&) override;
610     // Used by an ARIA tree item to get only its content, and not its child tree items and groups.
611     void ariaTreeItemContent(AccessibilityChildrenVector&) override;
612
613     // ARIA live-region features.
614     bool supportsLiveRegion(bool excludeIfOff = true) const override;
615     bool isInsideLiveRegion(bool excludeIfOff = true) const override;
616     AccessibilityObject* liveRegionAncestor(bool excludeIfOff = true) const override;
617     const String liveRegionStatus() const override { return String(); }
618     const String liveRegionRelevant() const override { return nullAtom(); }
619     bool liveRegionAtomic() const override { return false; }
620     bool isBusy() const override { return false; }
621     static const String defaultLiveRegionStatusForRole(AccessibilityRole);
622     static bool liveRegionStatusIsEnabled(const AtomString&);
623     static bool contentEditableAttributeIsEnabled(Element*);
624     bool hasContentEditableAttributeSet() const override;
625
626     bool supportsReadOnly() const override;
627     String readOnlyValue() const override;
628
629     bool supportsAutoComplete() const override;
630     String autoCompleteValue() const override;
631
632     bool hasARIAValueNow() const override { return hasAttribute(HTMLNames::aria_valuenowAttr); }
633     bool supportsARIAAttributes() const override;
634
635     // CSS3 Speech properties.
636     OptionSet<SpeakAs> speakAsProperty() const override { return OptionSet<SpeakAs> { }; }
637
638     // Make this object visible by scrolling as many nested scrollable views as needed.
639     void scrollToMakeVisible() const override;
640     // Same, but if the whole object can't be made visible, try for this subrect, in local coordinates.
641     void scrollToMakeVisibleWithSubFocus(const IntRect&) const override;
642     // Scroll this object to a given point in global coordinates of the top-level window.
643     void scrollToGlobalPoint(const IntPoint&) const override;
644
645     bool scrollByPage(ScrollByPageDirection) const override;
646     IntPoint scrollPosition() const override;
647     IntSize scrollContentsSize() const override;
648     IntRect scrollVisibleContentRect() const override;
649     void scrollToMakeVisible(const ScrollRectToVisibleOptions&) const override;
650
651     bool lastKnownIsIgnoredValue() override;
652     void setLastKnownIsIgnoredValue(bool) override;
653
654     // Fires a children changed notification on the parent if the isIgnored value changed.
655     void notifyIfIgnoredValueChanged() override;
656
657     // All math elements return true for isMathElement().
658     bool isMathElement() const override { return false; }
659     bool isMathFraction() const override { return false; }
660     bool isMathFenced() const override { return false; }
661     bool isMathSubscriptSuperscript() const override { return false; }
662     bool isMathRow() const override { return false; }
663     bool isMathUnderOver() const override { return false; }
664     bool isMathRoot() const override { return false; }
665     bool isMathSquareRoot() const override { return false; }
666     bool isMathText() const override { return false; }
667     bool isMathNumber() const override { return false; }
668     bool isMathOperator() const override { return false; }
669     bool isMathFenceOperator() const override { return false; }
670     bool isMathSeparatorOperator() const override { return false; }
671     bool isMathIdentifier() const override { return false; }
672     bool isMathTable() const override { return false; }
673     bool isMathTableRow() const override { return false; }
674     bool isMathTableCell() const override { return false; }
675     bool isMathMultiscript() const override { return false; }
676     bool isMathToken() const override { return false; }
677     bool isMathScriptObject(AccessibilityMathScriptObjectType) const override { return false; }
678     bool isMathMultiscriptObject(AccessibilityMathMultiscriptObjectType) const override { return false; }
679
680     // Root components.
681     AXCoreObject* mathRadicandObject() override { return nullptr; }
682     AXCoreObject* mathRootIndexObject() override { return nullptr; }
683
684     // Under over components.
685     AXCoreObject* mathUnderObject() override { return nullptr; }
686     AXCoreObject* mathOverObject() override { return nullptr; }
687
688     // Fraction components.
689     AXCoreObject* mathNumeratorObject() override { return nullptr; }
690     AXCoreObject* mathDenominatorObject() override { return nullptr; }
691
692     // Subscript/superscript components.
693     AXCoreObject* mathBaseObject() override { return nullptr; }
694     AXCoreObject* mathSubscriptObject() override { return nullptr; }
695     AXCoreObject* mathSuperscriptObject() override { return nullptr; }
696
697     // Fenced components.
698     String mathFencedOpenString() const override { return String(); }
699     String mathFencedCloseString() const override { return String(); }
700     int mathLineThickness() const override { return 0; }
701     bool isAnonymousMathOperator() const override { return false; }
702
703     // Multiscripts components.
704     void mathPrescripts(AccessibilityMathMultiscriptPairs&) override { }
705     void mathPostscripts(AccessibilityMathMultiscriptPairs&) override { }
706
707     // Visibility.
708     bool isAXHidden() const override;
709     bool isDOMHidden() const override;
710     bool isHidden() const override { return isAXHidden() || isDOMHidden(); }
711
712 #if PLATFORM(COCOA)
713     void overrideAttachmentParent(AXCoreObject* parent) override;
714 #else
715     void overrideAttachmentParent(AXCoreObject*) override { }
716 #endif
717
718 #if ENABLE(ACCESSIBILITY)
719     // a platform-specific method for determining if an attachment is ignored
720     bool accessibilityIgnoreAttachment() const override;
721     // gives platforms the opportunity to indicate if and how an object should be included
722     AccessibilityObjectInclusion accessibilityPlatformIncludesObject() const override;
723 #else
724     bool accessibilityIgnoreAttachment() const override { return true; }
725     AccessibilityObjectInclusion accessibilityPlatformIncludesObject() const override { return AccessibilityObjectInclusion::DefaultBehavior; }
726 #endif
727
728 #if PLATFORM(IOS_FAMILY)
729     int accessibilityPasswordFieldLength() override;
730     bool hasTouchEventListener() const override;
731     bool isInputTypePopupButton() const override;
732 #endif
733
734     // allows for an AccessibilityObject to update its render tree or perform
735     // other operations update type operations
736     void updateBackingStore() override;
737
738 #if PLATFORM(COCOA)
739     bool preventKeyboardDOMEventDispatch() const override;
740     void setPreventKeyboardDOMEventDispatch(bool) override;
741     bool fileUploadButtonReturnsValueInTitle() const override;
742     String speechHintAttributeValue() const override;
743     String descriptionAttributeValue() const override;
744     String helpTextAttributeValue() const override;
745     String titleAttributeValue() const override;
746     bool hasApplePDFAnnotationAttribute() const override { return hasAttribute(HTMLNames::x_apple_pdf_annotationAttr); }
747 #endif
748
749 #if PLATFORM(COCOA) && !PLATFORM(IOS_FAMILY)
750     bool caretBrowsingEnabled() const override;
751     void setCaretBrowsingEnabled(bool) override;
752 #endif
753
754     AccessibilityObject* focusableAncestor() override;
755     AccessibilityObject* editableAncestor() override;
756     AccessibilityObject* highestEditableAncestor() override;
757
758     const AccessibilityScrollView* ancestorAccessibilityScrollView(bool includeSelf) const override;
759     AccessibilityObject* webAreaObject() const override { return nullptr; }
760
761     void clearIsIgnoredFromParentData() override { m_isIgnoredFromParentData = AccessibilityIsIgnoredFromParentData(); }
762     void setIsIgnoredFromParentDataForChild(AXCoreObject*) override;
763
764     uint64_t sessionID() const override;
765     String documentURI() const override;
766     String documentEncoding() const override;
767
768 protected:
769     AccessibilityObject() = default;
770     void detachRemoteParts(AccessibilityDetachmentType) override;
771     void detachPlatformWrapper(AccessibilityDetachmentType) override;
772
773     AXID m_id { 0 };
774     AccessibilityChildrenVector m_children;
775     mutable bool m_haveChildren { false };
776     AccessibilityRole m_role { AccessibilityRole::Unknown };
777     AccessibilityObjectInclusion m_lastKnownIsIgnoredValue { AccessibilityObjectInclusion::DefaultBehavior };
778     AccessibilityIsIgnoredFromParentData m_isIgnoredFromParentData { };
779     bool m_childrenDirty { false };
780     bool m_subtreeDirty { false };
781 #if ENABLE(ACCESSIBILITY_ISOLATED_TREE)
782     bool m_isolatedTreeNodeInitialized { false };
783 #endif
784
785     void setIsIgnoredFromParentData(AccessibilityIsIgnoredFromParentData& data) override { m_isIgnoredFromParentData = data; }
786
787     virtual bool computeAccessibilityIsIgnored() const { return true; }
788     bool isAccessibilityObject() const override { return true; }
789
790     // If this object itself scrolls, return its ScrollableArea.
791     virtual ScrollableArea* getScrollableAreaIfScrollable() const { return nullptr; }
792     virtual void scrollTo(const IntPoint&) const { }
793     ScrollableArea* scrollableAreaAncestor() const;
794     void scrollAreaAndAncestor(std::pair<ScrollableArea*, AccessibilityObject*>&) const;
795
796     virtual AccessibilityRole buttonRoleType() const;
797     String rolePlatformDescription() const;
798     bool isOnScreen() const override;
799     bool dispatchTouchEvent();
800
801     void ariaElementsFromAttribute(AccessibilityChildrenVector&, const QualifiedName&) const;
802     void ariaElementsReferencedByAttribute(AccessibilityChildrenVector&, const QualifiedName&) const;
803
804     AccessibilityObject* radioGroupAncestor() const;
805
806 #if ENABLE(ACCESSIBILITY) && USE(ATK)
807     bool allowsTextRanges() const;
808     unsigned getLengthForTextRange() const;
809 #else
810     bool allowsTextRanges() const { return isTextControl(); }
811     unsigned getLengthForTextRange() const { return text().length(); }
812 #endif
813 };
814
815 #if !ENABLE(ACCESSIBILITY)
816 inline const AccessibilityObject::AccessibilityChildrenVector& AccessibilityObject::children(bool) { return m_children; }
817 inline String AccessibilityObject::actionVerb() const { return emptyString(); }
818 inline int AccessibilityObject::lineForPosition(const VisiblePosition&) const { return -1; }
819 inline void AccessibilityObject::updateBackingStore() { }
820 inline void AccessibilityObject::detachPlatformWrapper(AccessibilityDetachmentType) { }
821 #endif
822
823 AccessibilityObject* firstAccessibleObjectFromNode(const Node*, const WTF::Function<bool(const AccessibilityObject&)>& isAccessible);
824
825 namespace Accessibility {
826
827 using PlatformRoleMap = HashMap<AccessibilityRole, String, DefaultHash<unsigned>::Hash, WTF::UnsignedWithZeroKeyHashTraits<unsigned>>;
828
829 PlatformRoleMap createPlatformRoleMap();
830 String roleToPlatformString(AccessibilityRole);
831
832 } // namespace Accessibility
833
834 } // namespace WebCore
835
836 #define SPECIALIZE_TYPE_TRAITS_ACCESSIBILITY(ToValueTypeName, predicate) \
837 SPECIALIZE_TYPE_TRAITS_BEGIN(WebCore::ToValueTypeName) \
838     static bool isType(const WebCore::AXCoreObject& object) { return object.predicate; } \
839 SPECIALIZE_TYPE_TRAITS_END()
840
841 SPECIALIZE_TYPE_TRAITS_BEGIN(WebCore::AccessibilityObject)
842 static bool isType(const WebCore::AXCoreObject& context) { return context.isAccessibilityObject(); }
843 SPECIALIZE_TYPE_TRAITS_END()