6b15de28c3611a8efad742dffff09845735340e1
[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     bool isTableRow() const override { return false; }
184
185     bool isTableColumn() const override { return false; }
186     unsigned columnIndex() const override { return 0; }
187     AXCoreObject* columnHeader() override { return nullptr; }
188
189     bool isFieldset() const override { return false; }
190     bool isGroup() const override { return false; }
191     bool isARIATreeGridRow() const override { return false; }
192     bool isImageMapLink() const override { return false; }
193     bool isMenuList() const override { return false; }
194     bool isMenuListPopup() const override { return false; }
195     bool isMenuListOption() const override { return false; }
196     bool isNativeSpinButton() const override { return false; }
197     AXCoreObject* incrementButton() override { return nullptr; }
198     AXCoreObject* decrementButton() override { return nullptr; }
199     bool isSpinButtonPart() const override { return false; }
200     bool isIncrementor() const override { return false; }
201     bool isMockObject() const override { return false; }
202     virtual bool isMediaControlLabel() const { return false; }
203     bool isMediaObject() const override { return false; }
204     bool isTextControl() const override;
205     bool isARIATextControl() const override;
206     bool isNonNativeTextControl() const override;
207     bool isButton() const override;
208     bool isBlockquote() const override;
209     bool isLandmark() const override;
210     bool isRangeControl() const override;
211     bool isMeter() const override;
212     bool isStyleFormatGroup() const override;
213     bool isFigureElement() const override;
214     bool isKeyboardFocusable() const override;
215     bool isOutput() const override;
216
217     bool isChecked() const override { return false; }
218     bool isEnabled() const override { return false; }
219     bool isSelected() const override { return false; }
220     bool isFocused() const override { return false; }
221     bool isHovered() const override { return false; }
222     bool isIndeterminate() const override { return false; }
223     bool isLoaded() const override { return false; }
224     bool isMultiSelectable() const override { return false; }
225     bool isOffScreen() const override { return false; }
226     bool isPressed() const override { return false; }
227     bool isUnvisited() const override { return false; }
228     bool isVisited() const override { return false; }
229     bool isRequired() const override { return false; }
230     bool supportsRequiredAttribute() const override { return false; }
231     bool isLinked() const override { return false; }
232     bool isExpanded() const override;
233     bool isVisible() const override { return true; }
234     bool isCollapsed() const override { return false; }
235     void setIsExpanded(bool) override { }
236     FloatRect relativeFrame() const override;
237     FloatRect convertFrameToSpace(const FloatRect&, AccessibilityConversionSpace) const override;
238
239     // In a multi-select list, many items can be selected but only one is active at a time.
240     bool isSelectedOptionActive() const override { return false; }
241
242     bool hasBoldFont() const override { return false; }
243     bool hasItalicFont() const override { return false; }
244     bool hasMisspelling() const override;
245     RefPtr<Range> getMisspellingRange(RefPtr<Range> const& start, AccessibilitySearchDirection) const override;
246     bool hasPlainText() const override { return false; }
247     bool hasSameFont(RenderObject*) const override { return false; }
248     bool hasSameFontColor(RenderObject*) const override { return false; }
249     bool hasSameStyle(RenderObject*) const override { return false; }
250     bool hasUnderline() const override { return false; }
251     bool hasHighlighting() const override;
252
253     bool supportsDatetimeAttribute() const override;
254     String datetimeAttributeValue() const override;
255
256     bool canSetFocusAttribute() const override { return false; }
257     bool canSetTextRangeAttributes() const override { return false; }
258     bool canSetValueAttribute() const override { return false; }
259     bool canSetNumericValue() const override { return false; }
260     bool canSetSelectedAttribute() const override { return false; }
261     bool canSetSelectedChildrenAttribute() const override { return false; }
262     bool canSetExpandedAttribute() const override { return false; }
263
264     Element* element() const override;
265     Node* node() const override { return nullptr; }
266     RenderObject* renderer() const override { return nullptr; }
267     bool accessibilityIsIgnored() const override;
268     AccessibilityObjectInclusion defaultObjectInclusion() const override;
269     bool accessibilityIsIgnoredByDefault() const override;
270
271     bool isShowingValidationMessage() const override;
272     String validationMessage() const override;
273
274     unsigned blockquoteLevel() const override;
275     int headingLevel() const override { return 0; }
276     AccessibilityButtonState checkboxOrRadioValue() const override;
277     String valueDescription() const override { return String(); }
278     float valueForRange() const override { return 0.0f; }
279     float maxValueForRange() const override { return 0.0f; }
280     float minValueForRange() const override { return 0.0f; }
281     float stepValueForRange() const override { return 0.0f; }
282     AXCoreObject* selectedRadioButton() override { return nullptr; }
283     AXCoreObject* selectedTabItem() override { return nullptr; }
284     AXCoreObject* selectedListItem() override;
285     int layoutCount() const override { return 0; }
286     double estimatedLoadingProgress() const override { return 0; }
287     WEBCORE_EXPORT static bool isARIAControl(AccessibilityRole);
288     WEBCORE_EXPORT static bool isARIAInput(AccessibilityRole);
289
290     bool supportsARIAOwns() const override { return false; }
291     bool isActiveDescendantOfFocusedContainer() const override;
292     void ariaActiveDescendantReferencingElements(AccessibilityChildrenVector&) const override;
293     void ariaControlsElements(AccessibilityChildrenVector&) const override;
294     void ariaControlsReferencingElements(AccessibilityChildrenVector&) const override;
295     void ariaDescribedByElements(AccessibilityChildrenVector&) const override;
296     void ariaDescribedByReferencingElements(AccessibilityChildrenVector&) const override;
297     void ariaDetailsElements(AccessibilityChildrenVector&) const override;
298     void ariaDetailsReferencingElements(AccessibilityChildrenVector&) const override;
299     void ariaErrorMessageElements(AccessibilityChildrenVector&) const override;
300     void ariaErrorMessageReferencingElements(AccessibilityChildrenVector&) const override;
301     void ariaFlowToElements(AccessibilityChildrenVector&) const override;
302     void ariaFlowToReferencingElements(AccessibilityChildrenVector&) const override;
303     void ariaLabelledByElements(AccessibilityChildrenVector&) const override;
304     void ariaLabelledByReferencingElements(AccessibilityChildrenVector&) const override;
305     void ariaOwnsElements(AccessibilityChildrenVector&) const override;
306     void ariaOwnsReferencingElements(AccessibilityChildrenVector&) const override;
307
308     bool hasPopup() const override { return false; }
309     String popupValue() const override;
310     bool hasDatalist() const override;
311     bool supportsHasPopup() const override;
312     bool pressedIsPresent() const override;
313     bool ariaIsMultiline() const override;
314     String invalidStatus() const override;
315     bool supportsPressed() const override;
316     bool supportsExpanded() const override;
317     bool supportsChecked() 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     bool ignoredFromModalPresence() const override;
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 supportsARIADropping() const override { return false; }
341     bool supportsARIADragging() const override { return false; }
342     bool isARIAGrabbed() override { return false; }
343     void setARIAGrabbed(bool) override { }
344     Vector<String> determineARIADropEffects() 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     AccessibilityObject* firstChild() const override { return nullptr; }
354     AccessibilityObject* lastChild() const override { return nullptr; }
355     AccessibilityObject* previousSibling() const override { return nullptr; }
356     AccessibilityObject* nextSibling() const override { return nullptr; }
357     AccessibilityObject* nextSiblingUnignored(int limit) const override;
358     AccessibilityObject* previousSiblingUnignored(int limit) const override;
359     AccessibilityObject* parentObject() const override { return nullptr; }
360     AXCoreObject* parentObjectUnignored() const override;
361     AccessibilityObject* parentObjectIfExists() const override { return nullptr; }
362     static AccessibilityObject* firstAccessibleObjectFromNode(const Node*);
363     void findMatchingObjects(AccessibilitySearchCriteria*, AccessibilityChildrenVector&) override;
364     bool isDescendantOfBarrenParent() const override { return false; }
365
366     bool isDescendantOfRole(AccessibilityRole) const override;
367
368     // Text selection
369 private:
370     RefPtr<Range> rangeOfStringClosestToRangeInDirection(Range*, AccessibilitySearchDirection, Vector<String> const&) const;
371     RefPtr<Range> selectionRange() const;
372     RefPtr<Range> findTextRange(Vector<String> const& searchStrings, RefPtr<Range> const& start, AccessibilitySearchTextDirection) const;
373 public:
374     Vector<RefPtr<Range>> findTextRanges(AccessibilitySearchTextCriteria const&) const override;
375     Vector<String> performTextOperation(AccessibilityTextOperation const&) override;
376
377     AccessibilityObject* observableObject() const override { return nullptr; }
378     void linkedUIElements(AccessibilityChildrenVector&) const override { }
379     AccessibilityObject* titleUIElement() const override { return nullptr; }
380     bool exposesTitleUIElement() const override { return true; }
381     AccessibilityObject* correspondingLabelForControlElement() const override { return nullptr; }
382     AccessibilityObject* correspondingControlForLabelElement() const override { return nullptr; }
383     AccessibilityObject* scrollBar(AccessibilityOrientation) override { return nullptr; }
384
385     AccessibilityRole ariaRoleAttribute() const override { return AccessibilityRole::Unknown; }
386     bool isPresentationalChildOfAriaRole() const override { return false; }
387     bool ariaRoleHasPresentationalChildren() const override { return false; }
388     bool inheritsPresentationalRole() const override { return false; }
389
390     // Accessibility Text
391     void accessibilityText(Vector<AccessibilityText>&) const override { };
392     // A single method for getting a computed label for an AXObject. It condenses the nuances of accessibilityText. Used by Inspector.
393     String computedLabel() override;
394
395     // A programmatic way to set a name on an AccessibleObject.
396     void setAccessibleName(const AtomString&) override { }
397     bool hasAttributesRequiredForInclusion() const override;
398
399     // Accessibility Text - (To be deprecated).
400     String accessibilityDescription() const override { return String(); }
401     String title() const override { return String(); }
402     String helpText() const override { return String(); }
403
404     // Methods for determining accessibility text.
405     bool isARIAStaticText() const override { return ariaRoleAttribute() == AccessibilityRole::StaticText; }
406     String stringValue() const override { return String(); }
407     String textUnderElement(AccessibilityTextUnderElementMode = AccessibilityTextUnderElementMode()) const override { return String(); }
408     String text() const override { return String(); }
409     int textLength() const override { return 0; }
410     String ariaLabeledByAttribute() const override { return String(); }
411     String ariaDescribedByAttribute() const override { return String(); }
412     const String placeholderValue() const override;
413     bool accessibleNameDerivesFromContent() const override;
414
415     // Abbreviations
416     String expandedTextValue() const override { return String(); }
417     bool supportsExpandedTextValue() const override { return false; }
418
419     void elementsFromAttribute(Vector<Element*>&, const QualifiedName&) const override;
420
421     // Only if isColorWell()
422     void colorValue(int& r, int& g, int& b) const override { r = 0; g = 0; b = 0; }
423
424     AccessibilityRole roleValue() const override { return m_role; }
425     String rolePlatformString() const override;
426     String roleDescription() 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     TextIteratorBehavior textIteratorBehaviorForTextRange() const override;
445     PlainTextRange selectedTextRange() const override { return PlainTextRange(); }
446     unsigned selectionStart() const override { return selectedTextRange().start; }
447     unsigned selectionEnd() const override { return selectedTextRange().length; }
448
449     URL url() const override { return URL(); }
450     VisibleSelection selection() const override { return VisibleSelection(); }
451     String selectedText() const override { return String(); }
452     String accessKey() const override { return nullAtom(); }
453     String actionVerb() const override;
454     Widget* widget() const override { return nullptr; }
455     Widget* widgetForAttachmentView() const override { return nullptr; }
456     Page* page() const override;
457     Document* document() const override;
458     FrameView* documentFrameView() const override;
459     Frame* frame() const override;
460     Frame* mainFrame() const override;
461     Document* topDocument() const override;
462     ScrollView* scrollViewAncestor() const override;
463     String language() const override;
464     // 1-based, to match the aria-level spec.
465     unsigned hierarchicalLevel() const override { return 0; }
466     bool isInlineText() const override;
467
468     void setFocused(bool) override { }
469     void setSelectedText(const String&) override { }
470     void setSelectedTextRange(const PlainTextRange&) override { }
471     void setValue(const String&) override { }
472     bool replaceTextInRange(const String&, const PlainTextRange&) override;
473     bool insertText(const String&) override;
474
475     void setValue(float) override { }
476     void setSelected(bool) override { }
477     void setSelectedRows(AccessibilityChildrenVector&) override { }
478
479     void makeRangeVisible(const PlainTextRange&) override { }
480     bool press() override;
481     bool performDefaultAction() override { return press(); }
482
483     AccessibilityOrientation orientation() const override;
484     void increment() override { }
485     void decrement() override { }
486
487     void childrenChanged() override { }
488     void textChanged() override { }
489     void updateAccessibilityRole() override { }
490     const AccessibilityChildrenVector& children(bool updateChildrenIfNeeded = true) override;
491     void addChildren() override { }
492     void addChild(AXCoreObject*) override;
493     void insertChild(AXCoreObject*, unsigned) override;
494
495     bool shouldIgnoreAttributeRole() const override { return false; }
496
497     bool canHaveChildren() const override { return true; }
498     bool hasChildren() const override { return m_haveChildren; }
499     void updateChildrenIfNecessary() override;
500     void setNeedsToUpdateChildren() override { }
501     void setNeedsToUpdateSubtree() override { }
502     void clearChildren() override;
503     bool needsToUpdateChildren() const override { return false; }
504 #if PLATFORM(COCOA)
505     void detachFromParent() override;
506 #else
507     void detachFromParent() override { }
508 #endif
509     bool isDetachedFromParent() override { return false; }
510
511     bool canHaveSelectedChildren() const override { return false; }
512     void selectedChildren(AccessibilityChildrenVector&) override { }
513     void visibleChildren(AccessibilityChildrenVector&) override { }
514     void tabChildren(AccessibilityChildrenVector&) override { }
515     bool shouldFocusActiveDescendant() const override { return false; }
516     AccessibilityObject* activeDescendant() const override { return nullptr; }
517     void handleActiveDescendantChanged() override { }
518     void handleAriaExpandedChanged() override { }
519     AccessibilityObject* firstAnonymousBlockChild() const override;
520
521     WEBCORE_EXPORT static AccessibilityRole ariaRoleToWebCoreRole(const String&);
522     bool hasAttribute(const QualifiedName&) const override;
523     const AtomString& getAttribute(const QualifiedName&) const override;
524     bool hasTagName(const QualifiedName&) const override;
525     String tagName() const override;
526
527     VisiblePositionRange visiblePositionRange() const override { return VisiblePositionRange(); }
528     VisiblePositionRange visiblePositionRangeForLine(unsigned) const override { return VisiblePositionRange(); }
529
530     RefPtr<Range> elementRange() const override;
531     static bool replacedNodeNeedsCharacter(Node* replacedNode);
532
533     VisiblePositionRange visiblePositionRangeForUnorderedPositions(const VisiblePosition&, const VisiblePosition&) const override;
534     VisiblePositionRange positionOfLeftWord(const VisiblePosition&) const override;
535     VisiblePositionRange positionOfRightWord(const VisiblePosition&) const override;
536     VisiblePositionRange leftLineVisiblePositionRange(const VisiblePosition&) const override;
537     VisiblePositionRange rightLineVisiblePositionRange(const VisiblePosition&) const override;
538     VisiblePositionRange sentenceForPosition(const VisiblePosition&) const override;
539     VisiblePositionRange paragraphForPosition(const VisiblePosition&) const override;
540     VisiblePositionRange styleRangeForPosition(const VisiblePosition&) const override;
541     VisiblePositionRange visiblePositionRangeForRange(const PlainTextRange&) const override;
542     VisiblePositionRange lineRangeForPosition(const VisiblePosition&) const override;
543
544     RefPtr<Range> rangeForPlainTextRange(const PlainTextRange&) const override;
545
546     static String stringForVisiblePositionRange(const VisiblePositionRange&);
547     String stringForRange(RefPtr<Range>) const override;
548     IntRect boundsForVisiblePositionRange(const VisiblePositionRange&) const override { return IntRect(); }
549     IntRect boundsForRange(const RefPtr<Range>) const override { return IntRect(); }
550     int lengthForVisiblePositionRange(const VisiblePositionRange&) const override;
551     void setSelectedVisiblePositionRange(const VisiblePositionRange&) const override { }
552
553     VisiblePosition visiblePositionForBounds(const IntRect&, AccessibilityVisiblePositionForBounds) const override;
554     VisiblePosition visiblePositionForPoint(const IntPoint&) const override { return VisiblePosition(); }
555     VisiblePosition nextVisiblePosition(const VisiblePosition& visiblePos) const override { return visiblePos.next(); }
556     VisiblePosition previousVisiblePosition(const VisiblePosition& visiblePos) const override { return visiblePos.previous(); }
557     VisiblePosition nextWordEnd(const VisiblePosition&) const override;
558     VisiblePosition previousWordStart(const VisiblePosition&) const override;
559     VisiblePosition nextLineEndPosition(const VisiblePosition&) const override;
560     VisiblePosition previousLineStartPosition(const VisiblePosition&) const override;
561     VisiblePosition nextSentenceEndPosition(const VisiblePosition&) const override;
562     VisiblePosition previousSentenceStartPosition(const VisiblePosition&) const override;
563     VisiblePosition nextParagraphEndPosition(const VisiblePosition&) const override;
564     VisiblePosition previousParagraphStartPosition(const VisiblePosition&) const override;
565     VisiblePosition visiblePositionForIndex(unsigned, bool /*lastIndexOK */) const override { return VisiblePosition(); }
566
567     VisiblePosition visiblePositionForIndex(int) const override { return VisiblePosition(); }
568     int indexForVisiblePosition(const VisiblePosition&) const override { return 0; }
569
570     AccessibilityObject* accessibilityObjectForPosition(const VisiblePosition&) const override;
571     int lineForPosition(const VisiblePosition&) const override;
572     PlainTextRange plainTextRangeForVisiblePositionRange(const VisiblePositionRange&) const override;
573     int index(const VisiblePosition&) const override { return -1; }
574
575     void lineBreaks(Vector<int>&) const override { }
576     PlainTextRange doAXRangeForLine(unsigned) const override { return PlainTextRange(); }
577     PlainTextRange doAXRangeForPosition(const IntPoint&) const override;
578     PlainTextRange doAXRangeForIndex(unsigned) const override { return PlainTextRange(); }
579     PlainTextRange doAXStyleRangeForIndex(unsigned) const override;
580
581     String doAXStringForRange(const PlainTextRange&) const override { return String(); }
582     IntRect doAXBoundsForRange(const PlainTextRange&) const override { return IntRect(); }
583     IntRect doAXBoundsForRangeUsingCharacterOffset(const PlainTextRange&) const override { return IntRect(); }
584     static String listMarkerTextForNodeAndPosition(Node*, const VisiblePosition&);
585
586     unsigned doAXLineForIndex(unsigned) override;
587
588     String computedRoleString() const override;
589
590     String stringValueForMSAA() const override { return String(); }
591     String stringRoleForMSAA() const override { return String(); }
592     String nameForMSAA() const override { return String(); }
593     String descriptionForMSAA() const override { return String(); }
594     AccessibilityRole roleValueForMSAA() const override { return roleValue(); }
595
596     String passwordFieldValue() const override { return String(); }
597     bool isValueAutofilled() const override;
598     bool isValueAutofillAvailable() const override;
599     AutoFillButtonType valueAutofillButtonType() const override;
600
601     // Used by an ARIA tree to get all its rows.
602     void ariaTreeRows(AccessibilityChildrenVector&) override;
603     // Used by an ARIA tree item to get all of its direct rows that it can disclose.
604     void ariaTreeItemDisclosedRows(AccessibilityChildrenVector&) override;
605     // Used by an ARIA tree item to get only its content, and not its child tree items and groups.
606     void ariaTreeItemContent(AccessibilityChildrenVector&) override;
607
608     // ARIA live-region features.
609     bool supportsLiveRegion(bool excludeIfOff = true) const override;
610     bool isInsideLiveRegion(bool excludeIfOff = true) const override;
611     AccessibilityObject* liveRegionAncestor(bool excludeIfOff = true) const override;
612     const String liveRegionStatus() const override { return String(); }
613     const String liveRegionRelevant() const override { return nullAtom(); }
614     bool liveRegionAtomic() const override { return false; }
615     bool isBusy() const override { return false; }
616     static const String defaultLiveRegionStatusForRole(AccessibilityRole);
617     static bool liveRegionStatusIsEnabled(const AtomString&);
618     static bool contentEditableAttributeIsEnabled(Element*);
619     bool hasContentEditableAttributeSet() const override;
620
621     bool supportsReadOnly() const override;
622     String readOnlyValue() const override;
623
624     bool supportsAutoComplete() const override;
625     String autoCompleteValue() const override;
626
627     bool hasARIAValueNow() const override { return hasAttribute(HTMLNames::aria_valuenowAttr); }
628     bool supportsARIAAttributes() const override;
629
630     // CSS3 Speech properties.
631     OptionSet<SpeakAs> speakAsProperty() const override { return OptionSet<SpeakAs> { }; }
632
633     // Make this object visible by scrolling as many nested scrollable views as needed.
634     void scrollToMakeVisible() const override;
635     // Same, but if the whole object can't be made visible, try for this subrect, in local coordinates.
636     void scrollToMakeVisibleWithSubFocus(const IntRect&) const override;
637     // Scroll this object to a given point in global coordinates of the top-level window.
638     void scrollToGlobalPoint(const IntPoint&) const override;
639
640     bool scrollByPage(ScrollByPageDirection) const override;
641     IntPoint scrollPosition() const override;
642     IntSize scrollContentsSize() const override;
643     IntRect scrollVisibleContentRect() const override;
644     void scrollToMakeVisible(const ScrollRectToVisibleOptions&) const override;
645
646     bool lastKnownIsIgnoredValue() override;
647     void setLastKnownIsIgnoredValue(bool) override;
648
649     // Fires a children changed notification on the parent if the isIgnored value changed.
650     void notifyIfIgnoredValueChanged() override;
651
652     // All math elements return true for isMathElement().
653     bool isMathElement() const override { return false; }
654     bool isMathFraction() const override { return false; }
655     bool isMathFenced() const override { return false; }
656     bool isMathSubscriptSuperscript() const override { return false; }
657     bool isMathRow() const override { return false; }
658     bool isMathUnderOver() const override { return false; }
659     bool isMathRoot() const override { return false; }
660     bool isMathSquareRoot() const override { return false; }
661     bool isMathText() const override { return false; }
662     bool isMathNumber() const override { return false; }
663     bool isMathOperator() const override { return false; }
664     bool isMathFenceOperator() const override { return false; }
665     bool isMathSeparatorOperator() const override { return false; }
666     bool isMathIdentifier() const override { return false; }
667     bool isMathTable() const override { return false; }
668     bool isMathTableRow() const override { return false; }
669     bool isMathTableCell() const override { return false; }
670     bool isMathMultiscript() const override { return false; }
671     bool isMathToken() const override { return false; }
672     bool isMathScriptObject(AccessibilityMathScriptObjectType) const override { return false; }
673     bool isMathMultiscriptObject(AccessibilityMathMultiscriptObjectType) const override { return false; }
674
675     // Root components.
676     AXCoreObject* mathRadicandObject() override { return nullptr; }
677     AXCoreObject* mathRootIndexObject() override { return nullptr; }
678
679     // Under over components.
680     AXCoreObject* mathUnderObject() override { return nullptr; }
681     AXCoreObject* mathOverObject() override { return nullptr; }
682
683     // Fraction components.
684     AXCoreObject* mathNumeratorObject() override { return nullptr; }
685     AXCoreObject* mathDenominatorObject() override { return nullptr; }
686
687     // Subscript/superscript components.
688     AXCoreObject* mathBaseObject() override { return nullptr; }
689     AXCoreObject* mathSubscriptObject() override { return nullptr; }
690     AXCoreObject* mathSuperscriptObject() override { return nullptr; }
691
692     // Fenced components.
693     String mathFencedOpenString() const override { return String(); }
694     String mathFencedCloseString() const override { return String(); }
695     int mathLineThickness() const override { return 0; }
696     bool isAnonymousMathOperator() const override { return false; }
697
698     // Multiscripts components.
699     void mathPrescripts(AccessibilityMathMultiscriptPairs&) override { }
700     void mathPostscripts(AccessibilityMathMultiscriptPairs&) override { }
701
702     // Visibility.
703     bool isAXHidden() const override;
704     bool isDOMHidden() const override;
705     bool isHidden() const override { return isAXHidden() || isDOMHidden(); }
706
707 #if PLATFORM(COCOA)
708     void overrideAttachmentParent(AXCoreObject* parent) override;
709 #else
710     void overrideAttachmentParent(AXCoreObject*) override { }
711 #endif
712
713 #if ENABLE(ACCESSIBILITY)
714     // a platform-specific method for determining if an attachment is ignored
715     bool accessibilityIgnoreAttachment() const override;
716     // gives platforms the opportunity to indicate if and how an object should be included
717     AccessibilityObjectInclusion accessibilityPlatformIncludesObject() const override;
718 #else
719     bool accessibilityIgnoreAttachment() const override { return true; }
720     AccessibilityObjectInclusion accessibilityPlatformIncludesObject() const override { return AccessibilityObjectInclusion::DefaultBehavior; }
721 #endif
722
723 #if PLATFORM(IOS_FAMILY)
724     int accessibilityPasswordFieldLength() override;
725     bool hasTouchEventListener() const override;
726     bool isInputTypePopupButton() const override;
727 #endif
728
729     // allows for an AccessibilityObject to update its render tree or perform
730     // other operations update type operations
731     void updateBackingStore() override;
732
733 #if PLATFORM(COCOA)
734     bool preventKeyboardDOMEventDispatch() const override;
735     void setPreventKeyboardDOMEventDispatch(bool) override;
736     bool fileUploadButtonReturnsValueInTitle() const override;
737     String speechHintAttributeValue() const override;
738     String descriptionAttributeValue() const override;
739     String helpTextAttributeValue() const override;
740     String titleAttributeValue() const override;
741     bool hasApplePDFAnnotationAttribute() const override { return hasAttribute(HTMLNames::x_apple_pdf_annotationAttr); }
742 #endif
743
744 #if PLATFORM(COCOA) && !PLATFORM(IOS_FAMILY)
745     bool caretBrowsingEnabled() const override;
746     void setCaretBrowsingEnabled(bool) override;
747 #endif
748
749     AccessibilityObject* focusableAncestor() override;
750     AccessibilityObject* editableAncestor() override;
751     AccessibilityObject* highestEditableAncestor() override;
752
753     const AccessibilityScrollView* ancestorAccessibilityScrollView(bool includeSelf) const override;
754
755     void clearIsIgnoredFromParentData() override { m_isIgnoredFromParentData = AccessibilityIsIgnoredFromParentData(); }
756     void setIsIgnoredFromParentDataForChild(AXCoreObject*) override;
757
758     uint64_t sessionID() const override;
759     String documentURI() const override;
760     String documentEncoding() const override;
761
762 protected:
763     AccessibilityObject() = default;
764     void detachRemoteParts(AccessibilityDetachmentType) override;
765     void detachPlatformWrapper(AccessibilityDetachmentType) override;
766
767     AXID m_id { 0 };
768     AccessibilityChildrenVector m_children;
769     mutable bool m_haveChildren { false };
770     AccessibilityRole m_role { AccessibilityRole::Unknown };
771     AccessibilityObjectInclusion m_lastKnownIsIgnoredValue { AccessibilityObjectInclusion::DefaultBehavior };
772     AccessibilityIsIgnoredFromParentData m_isIgnoredFromParentData { };
773     bool m_childrenDirty { false };
774     bool m_subtreeDirty { false };
775 #if ENABLE(ACCESSIBILITY_ISOLATED_TREE)
776     bool m_isolatedTreeNodeInitialized { false };
777 #endif
778
779     void setIsIgnoredFromParentData(AccessibilityIsIgnoredFromParentData& data) override { m_isIgnoredFromParentData = data; }
780
781     virtual bool computeAccessibilityIsIgnored() const { return true; }
782     bool isAccessibilityObject() const override { return true; }
783
784     // If this object itself scrolls, return its ScrollableArea.
785     virtual ScrollableArea* getScrollableAreaIfScrollable() const { return nullptr; }
786     virtual void scrollTo(const IntPoint&) const { }
787     ScrollableArea* scrollableAreaAncestor() const;
788     void scrollAreaAndAncestor(std::pair<ScrollableArea*, AccessibilityObject*>&) const;
789
790     virtual AccessibilityRole buttonRoleType() const;
791     String rolePlatformDescription() const;
792     bool isOnScreen() const override;
793     bool dispatchTouchEvent();
794
795     void ariaElementsFromAttribute(AccessibilityChildrenVector&, const QualifiedName&) const;
796     void ariaElementsReferencedByAttribute(AccessibilityChildrenVector&, const QualifiedName&) const;
797
798     AccessibilityObject* radioGroupAncestor() const;
799
800 #if ENABLE(ACCESSIBILITY) && USE(ATK)
801     bool allowsTextRanges() const;
802     unsigned getLengthForTextRange() const;
803 #else
804     bool allowsTextRanges() const { return isTextControl(); }
805     unsigned getLengthForTextRange() const { return text().length(); }
806 #endif
807 };
808
809 #if !ENABLE(ACCESSIBILITY)
810 inline const AccessibilityObject::AccessibilityChildrenVector& AccessibilityObject::children(bool) { return m_children; }
811 inline String AccessibilityObject::actionVerb() const { return emptyString(); }
812 inline int AccessibilityObject::lineForPosition(const VisiblePosition&) const { return -1; }
813 inline void AccessibilityObject::updateBackingStore() { }
814 inline void AccessibilityObject::detachPlatformWrapper(AccessibilityDetachmentType) { }
815 #endif
816
817 AccessibilityObject* firstAccessibleObjectFromNode(const Node*, const WTF::Function<bool(const AccessibilityObject&)>& isAccessible);
818
819 namespace Accessibility {
820
821 using PlatformRoleMap = HashMap<AccessibilityRole, String, DefaultHash<unsigned>::Hash, WTF::UnsignedWithZeroKeyHashTraits<unsigned>>;
822
823 PlatformRoleMap createPlatformRoleMap();
824 String roleToPlatformString(AccessibilityRole);
825
826 } // namespace Accessibility
827
828 } // namespace WebCore
829
830 #define SPECIALIZE_TYPE_TRAITS_ACCESSIBILITY(ToValueTypeName, predicate) \
831 SPECIALIZE_TYPE_TRAITS_BEGIN(WebCore::ToValueTypeName) \
832     static bool isType(const WebCore::AXCoreObject& object) { return object.predicate; } \
833 SPECIALIZE_TYPE_TRAITS_END()
834
835 SPECIALIZE_TYPE_TRAITS_BEGIN(WebCore::AccessibilityObject)
836 static bool isType(const WebCore::AXCoreObject& context) { return context.isAccessibilityObject(); }
837 SPECIALIZE_TYPE_TRAITS_END()