[ESNext][BigInt] Add support for op_inc
[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     IntRect pixelSnappedBoundingBoxRect() const override { return snappedIntRect(boundingBoxRect()); }
444     LayoutRect elementRect() const override = 0;
445     LayoutSize size() const override { return elementRect().size(); }
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     const AtomString& accessKey() const override { return nullAtom(); }
460     const 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
474     void setFocused(bool) override { }
475     void setSelectedText(const String&) override { }
476     void setSelectedTextRange(const PlainTextRange&) override { }
477     void setValue(const String&) override { }
478     bool replaceTextInRange(const String&, const PlainTextRange&) override;
479     bool insertText(const String&) override;
480
481     void setValue(float) override { }
482     void setSelected(bool) override { }
483     void setSelectedRows(AccessibilityChildrenVector&) override { }
484
485     void makeRangeVisible(const PlainTextRange&) override { }
486     bool press() override;
487     bool performDefaultAction() override { return press(); }
488
489     AccessibilityOrientation orientation() const override;
490     void increment() override { }
491     void decrement() override { }
492
493     void childrenChanged() override { }
494     void textChanged() override { }
495     void updateAccessibilityRole() override { }
496     const AccessibilityChildrenVector& children(bool updateChildrenIfNeeded = true) override;
497     void addChildren() override { }
498     void addChild(AXCoreObject*) override;
499     void insertChild(AXCoreObject*, unsigned) override;
500
501     bool shouldIgnoreAttributeRole() const override { return false; }
502
503     bool canHaveChildren() const override { return true; }
504     bool hasChildren() const override { return m_haveChildren; }
505     void updateChildrenIfNecessary() override;
506     void setNeedsToUpdateChildren() override { }
507     void setNeedsToUpdateSubtree() override { }
508     void clearChildren() override;
509     bool needsToUpdateChildren() const override { return false; }
510 #if PLATFORM(COCOA)
511     void detachFromParent() override;
512 #else
513     void detachFromParent() override { }
514 #endif
515     bool isDetachedFromParent() override { return false; }
516
517     bool canHaveSelectedChildren() const override { return false; }
518     void selectedChildren(AccessibilityChildrenVector&) override { }
519     void visibleChildren(AccessibilityChildrenVector&) override { }
520     void tabChildren(AccessibilityChildrenVector&) override { }
521     bool shouldFocusActiveDescendant() const override { return false; }
522     AccessibilityObject* activeDescendant() const override { return nullptr; }
523     void handleActiveDescendantChanged() override { }
524     void handleAriaExpandedChanged() override { }
525     bool isDescendantOfObject(const AXCoreObject*) const override;
526     bool isAncestorOfObject(const AXCoreObject*) const override;
527     AccessibilityObject* firstAnonymousBlockChild() const override;
528
529     WEBCORE_EXPORT static AccessibilityRole ariaRoleToWebCoreRole(const String&);
530     bool hasAttribute(const QualifiedName&) const override;
531     const AtomString& getAttribute(const QualifiedName&) const override;
532     bool hasTagName(const QualifiedName&) 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 all of its direct rows that it can disclose.
611     void ariaTreeItemDisclosedRows(AccessibilityChildrenVector&) override;
612     // Used by an ARIA tree item to get only its content, and not its child tree items and groups.
613     void ariaTreeItemContent(AccessibilityChildrenVector&) override;
614
615     // ARIA live-region features.
616     bool supportsLiveRegion(bool excludeIfOff = true) const override;
617     bool isInsideLiveRegion(bool excludeIfOff = true) const override;
618     AccessibilityObject* liveRegionAncestor(bool excludeIfOff = true) const override;
619     const String liveRegionStatus() const override { return String(); }
620     const String liveRegionRelevant() const override { return nullAtom(); }
621     bool liveRegionAtomic() const override { return false; }
622     bool isBusy() const override { return false; }
623     static const String defaultLiveRegionStatusForRole(AccessibilityRole);
624     static bool liveRegionStatusIsEnabled(const AtomString&);
625     static bool contentEditableAttributeIsEnabled(Element*);
626     bool hasContentEditableAttributeSet() const override;
627
628     bool supportsReadOnly() const override;
629     String readOnlyValue() const override;
630
631     bool supportsAutoComplete() const override;
632     String autoCompleteValue() const override;
633
634     bool supportsARIAAttributes() const override;
635
636     // CSS3 Speech properties.
637     OptionSet<SpeakAs> speakAsProperty() const override { return OptionSet<SpeakAs> { }; }
638
639     // Make this object visible by scrolling as many nested scrollable views as needed.
640     void scrollToMakeVisible() const override;
641     // Same, but if the whole object can't be made visible, try for this subrect, in local coordinates.
642     void scrollToMakeVisibleWithSubFocus(const IntRect&) const override;
643     // Scroll this object to a given point in global coordinates of the top-level window.
644     void scrollToGlobalPoint(const IntPoint&) const override;
645
646     bool scrollByPage(ScrollByPageDirection) const override;
647     IntPoint scrollPosition() const override;
648     IntSize scrollContentsSize() const override;
649     IntRect scrollVisibleContentRect() const override;
650     void scrollToMakeVisible(const ScrollRectToVisibleOptions&) const override;
651
652     bool lastKnownIsIgnoredValue() override;
653     void setLastKnownIsIgnoredValue(bool) override;
654
655     // Fires a children changed notification on the parent if the isIgnored value changed.
656     void notifyIfIgnoredValueChanged() override;
657
658     // All math elements return true for isMathElement().
659     bool isMathElement() const override { return false; }
660     bool isMathFraction() const override { return false; }
661     bool isMathFenced() const override { return false; }
662     bool isMathSubscriptSuperscript() const override { return false; }
663     bool isMathRow() const override { return false; }
664     bool isMathUnderOver() const override { return false; }
665     bool isMathRoot() const override { return false; }
666     bool isMathSquareRoot() const override { return false; }
667     bool isMathText() const override { return false; }
668     bool isMathNumber() const override { return false; }
669     bool isMathOperator() const override { return false; }
670     bool isMathFenceOperator() const override { return false; }
671     bool isMathSeparatorOperator() const override { return false; }
672     bool isMathIdentifier() const override { return false; }
673     bool isMathTable() const override { return false; }
674     bool isMathTableRow() const override { return false; }
675     bool isMathTableCell() const override { return false; }
676     bool isMathMultiscript() const override { return false; }
677     bool isMathToken() const override { return false; }
678     bool isMathScriptObject(AccessibilityMathScriptObjectType) const override { return false; }
679     bool isMathMultiscriptObject(AccessibilityMathMultiscriptObjectType) const override { return false; }
680
681     // Root components.
682     AXCoreObject* mathRadicandObject() override { return nullptr; }
683     AXCoreObject* mathRootIndexObject() override { return nullptr; }
684
685     // Under over components.
686     AXCoreObject* mathUnderObject() override { return nullptr; }
687     AXCoreObject* mathOverObject() override { return nullptr; }
688
689     // Fraction components.
690     AXCoreObject* mathNumeratorObject() override { return nullptr; }
691     AXCoreObject* mathDenominatorObject() override { return nullptr; }
692
693     // Subscript/superscript components.
694     AXCoreObject* mathBaseObject() override { return nullptr; }
695     AXCoreObject* mathSubscriptObject() override { return nullptr; }
696     AXCoreObject* mathSuperscriptObject() override { return nullptr; }
697
698     // Fenced components.
699     String mathFencedOpenString() const override { return String(); }
700     String mathFencedCloseString() const override { return String(); }
701     int mathLineThickness() const override { return 0; }
702     bool isAnonymousMathOperator() const override { return false; }
703
704     // Multiscripts components.
705     void mathPrescripts(AccessibilityMathMultiscriptPairs&) override { }
706     void mathPostscripts(AccessibilityMathMultiscriptPairs&) override { }
707
708     // Visibility.
709     bool isAXHidden() const override;
710     bool isDOMHidden() const override;
711     bool isHidden() const override { return isAXHidden() || isDOMHidden(); }
712
713 #if ENABLE(ACCESSIBILITY)
714     AccessibilityObjectWrapper* wrapper() const override { return m_wrapper.get(); }
715     void setWrapper(AccessibilityObjectWrapper* wrapper) override { m_wrapper = wrapper; }
716 #else
717     AccessibilityObjectWrapper* wrapper() const override { return nullptr; }
718     void setWrapper(AccessibilityObjectWrapper*) override { }
719 #endif
720
721 #if PLATFORM(COCOA)
722     void overrideAttachmentParent(AXCoreObject* parent) override;
723 #else
724     void overrideAttachmentParent(AXCoreObject*) override { }
725 #endif
726
727 #if ENABLE(ACCESSIBILITY)
728     // a platform-specific method for determining if an attachment is ignored
729     bool accessibilityIgnoreAttachment() const override;
730     // gives platforms the opportunity to indicate if and how an object should be included
731     AccessibilityObjectInclusion accessibilityPlatformIncludesObject() const override;
732 #else
733     bool accessibilityIgnoreAttachment() const override { return true; }
734     AccessibilityObjectInclusion accessibilityPlatformIncludesObject() const override { return AccessibilityObjectInclusion::DefaultBehavior; }
735 #endif
736
737 #if PLATFORM(IOS_FAMILY)
738     int accessibilityPasswordFieldLength() override;
739     bool hasTouchEventListener() const override;
740     bool isInputTypePopupButton() const override;
741 #endif
742
743     // allows for an AccessibilityObject to update its render tree or perform
744     // other operations update type operations
745     void updateBackingStore() override;
746
747 #if PLATFORM(COCOA)
748     bool preventKeyboardDOMEventDispatch() const override;
749     void setPreventKeyboardDOMEventDispatch(bool) override;
750     bool fileUploadButtonReturnsValueInTitle() const override;
751     String speechHintAttributeValue() const override;
752     String descriptionAttributeValue() const override;
753     String helpTextAttributeValue() const override;
754     String titleAttributeValue() const override;
755 #endif
756
757 #if PLATFORM(COCOA) && !PLATFORM(IOS_FAMILY)
758     bool caretBrowsingEnabled() const override;
759     void setCaretBrowsingEnabled(bool) override;
760 #endif
761
762     AccessibilityObject* focusableAncestor() override;
763     AccessibilityObject* editableAncestor() override;
764     AccessibilityObject* highestEditableAncestor() override;
765
766     const AccessibilityScrollView* ancestorAccessibilityScrollView(bool includeSelf) const override;
767
768     void clearIsIgnoredFromParentData() override { m_isIgnoredFromParentData = AccessibilityIsIgnoredFromParentData(); }
769     void setIsIgnoredFromParentDataForChild(AXCoreObject*) override;
770
771 protected:
772     AXID m_id { 0 };
773     AccessibilityChildrenVector m_children;
774     mutable bool m_haveChildren { false };
775     AccessibilityRole m_role { AccessibilityRole::Unknown };
776     AccessibilityObjectInclusion m_lastKnownIsIgnoredValue { AccessibilityObjectInclusion::DefaultBehavior };
777     AccessibilityIsIgnoredFromParentData m_isIgnoredFromParentData { };
778     bool m_childrenDirty { false };
779     bool m_subtreeDirty { false };
780 #if ENABLE(ACCESSIBILITY_ISOLATED_TREE)
781     bool m_isolatedTreeNodeInitialized { false };
782 #endif
783
784     void setIsIgnoredFromParentData(AccessibilityIsIgnoredFromParentData& data) override { m_isIgnoredFromParentData = data; }
785
786     virtual bool computeAccessibilityIsIgnored() const { return true; }
787     bool isAccessibilityObject() const override { return true; }
788
789     // If this object itself scrolls, return its ScrollableArea.
790     virtual ScrollableArea* getScrollableAreaIfScrollable() const { return nullptr; }
791     virtual void scrollTo(const IntPoint&) const { }
792     ScrollableArea* scrollableAreaAncestor() const;
793     void scrollAreaAndAncestor(std::pair<ScrollableArea*, AccessibilityObject*>&) const;
794
795     static bool isAccessibilityObjectSearchMatchAtIndex(AXCoreObject*, AccessibilitySearchCriteria*, size_t);
796     static bool isAccessibilityObjectSearchMatch(AXCoreObject*, AccessibilitySearchCriteria*);
797     static bool isAccessibilityTextSearchMatch(AXCoreObject*, AccessibilitySearchCriteria*);
798     static bool objectMatchesSearchCriteriaWithResultLimit(AXCoreObject*, AccessibilitySearchCriteria*, AccessibilityChildrenVector&);
799     virtual AccessibilityRole buttonRoleType() const;
800     String rolePlatformDescription() const;
801     bool isOnScreen() const override;
802     bool dispatchTouchEvent();
803
804     void ariaElementsFromAttribute(AccessibilityChildrenVector&, const QualifiedName&) const;
805     void ariaElementsReferencedByAttribute(AccessibilityChildrenVector&, const QualifiedName&) const;
806
807     AccessibilityObject* radioGroupAncestor() const;
808
809 #if ENABLE(ACCESSIBILITY) && USE(ATK)
810     bool allowsTextRanges() const;
811     unsigned getLengthForTextRange() const;
812 #else
813     bool allowsTextRanges() const { return isTextControl(); }
814     unsigned getLengthForTextRange() const { return text().length(); }
815 #endif
816
817 #if PLATFORM(COCOA)
818     RetainPtr<WebAccessibilityObjectWrapper> m_wrapper;
819 #elif PLATFORM(WIN)
820     COMPtr<AccessibilityObjectWrapper> m_wrapper;
821 #elif USE(ATK)
822     GRefPtr<WebKitAccessible> m_wrapper;
823 #endif
824 };
825
826 #if !ENABLE(ACCESSIBILITY)
827 inline const AccessibilityObject::AccessibilityChildrenVector& AccessibilityObject::children(bool) { return m_children; }
828 inline const String& AccessibilityObject::actionVerb() const { return emptyString(); }
829 inline int AccessibilityObject::lineForPosition(const VisiblePosition&) const { return -1; }
830 inline void AccessibilityObject::updateBackingStore() { }
831 #endif
832
833 AccessibilityObject* firstAccessibleObjectFromNode(const Node*, const WTF::Function<bool(const AccessibilityObject&)>& isAccessible);
834
835 namespace Accessibility {
836
837 using PlatformRoleMap = HashMap<AccessibilityRole, String, DefaultHash<unsigned>::Hash, WTF::UnsignedWithZeroKeyHashTraits<unsigned>>;
838
839 PlatformRoleMap createPlatformRoleMap();
840 String roleToPlatformString(AccessibilityRole);
841
842 } // namespace Accessibility
843
844 } // namespace WebCore
845
846 #define SPECIALIZE_TYPE_TRAITS_ACCESSIBILITY(ToValueTypeName, predicate) \
847 SPECIALIZE_TYPE_TRAITS_BEGIN(WebCore::ToValueTypeName) \
848     static bool isType(const WebCore::AXCoreObject& object) { return object.predicate; } \
849 SPECIALIZE_TYPE_TRAITS_END()
850
851 SPECIALIZE_TYPE_TRAITS_BEGIN(WebCore::AccessibilityObject)
852 static bool isType(const WebCore::AXCoreObject& context) { return context.isAccessibilityObject(); }
853 SPECIALIZE_TYPE_TRAITS_END()