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