Migrate accessibility/ to using nullptr instead of 0
[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 #ifndef AccessibilityObject_h
31 #define AccessibilityObject_h
32
33 #include "FloatQuad.h"
34 #include "LayoutRect.h"
35 #include "Path.h"
36 #include "TextIteratorBehavior.h"
37 #include "VisiblePosition.h"
38 #include "VisibleSelection.h"
39 #include <wtf/Forward.h>
40 #include <wtf/RefPtr.h>
41 #include <wtf/Vector.h>
42
43 #if PLATFORM(COCOA)
44 #include <wtf/RetainPtr.h>
45 #elif PLATFORM(WIN)
46 #include "AccessibilityObjectWrapperWin.h"
47 #include "COMPtr.h"
48 #endif
49
50 #if PLATFORM(COCOA)
51
52 typedef struct _NSRange NSRange;
53
54 OBJC_CLASS NSArray;
55 OBJC_CLASS NSAttributedString;
56 OBJC_CLASS NSData;
57 OBJC_CLASS NSMutableAttributedString;
58 OBJC_CLASS NSString;
59 OBJC_CLASS NSValue;
60 OBJC_CLASS NSView;
61 OBJC_CLASS WebAccessibilityObjectWrapper;
62
63 typedef WebAccessibilityObjectWrapper AccessibilityObjectWrapper;
64
65 #elif PLATFORM(GTK) || (PLATFORM(EFL) && HAVE(ACCESSIBILITY))
66 typedef struct _AtkObject AtkObject;
67 typedef struct _AtkObject AccessibilityObjectWrapper;
68 #else
69 class AccessibilityObjectWrapper;
70 #endif
71
72 namespace WebCore {
73
74 class AccessibilityObject;
75 class AXObjectCache;
76 class Element;
77 class Frame;
78 class FrameView;
79 class HTMLAnchorElement;
80 class HTMLAreaElement;
81 class IntPoint;
82 class IntSize;
83 class MainFrame;
84 class Node;
85 class Page;
86 class RenderObject;
87 class RenderListItem;
88 class ScrollableArea;
89 class ScrollView;
90 class Widget;
91
92 typedef unsigned AXID;
93
94 enum AccessibilityRole {
95     AnnotationRole = 1,
96     ApplicationRole,
97     ApplicationAlertRole,
98     ApplicationAlertDialogRole,
99     ApplicationDialogRole,
100     ApplicationLogRole,
101     ApplicationMarqueeRole,
102     ApplicationStatusRole,
103     ApplicationTimerRole,
104     AudioRole,
105     BrowserRole,
106     BusyIndicatorRole,
107     ButtonRole,
108     CanvasRole,
109     CellRole, 
110     CheckBoxRole,
111     ColorWellRole,
112     ColumnRole,
113     ColumnHeaderRole,
114     ComboBoxRole,
115     DefinitionRole,
116     DescriptionListRole,
117     DescriptionListTermRole,
118     DescriptionListDetailRole,
119     DirectoryRole,
120     DisclosureTriangleRole,
121     DivRole,
122     DocumentRole,
123     DocumentArticleRole,
124     DocumentMathRole,
125     DocumentNoteRole,
126     DocumentRegionRole,            
127     DrawerRole,
128     EditableTextRole,
129     FooterRole,
130     FormRole,
131     GridRole,
132     GroupRole,
133     GrowAreaRole,
134     HeadingRole,
135     HelpTagRole,
136     HorizontalRuleRole,
137     IgnoredRole,
138     ImageRole,
139     ImageMapRole,
140     ImageMapLinkRole,
141     IncrementorRole,
142     LabelRole,
143     LandmarkApplicationRole,
144     LandmarkBannerRole,
145     LandmarkComplementaryRole,
146     LandmarkContentInfoRole,
147     LandmarkMainRole,
148     LandmarkNavigationRole,
149     LandmarkSearchRole,
150     LegendRole,
151     LinkRole,
152     ListRole,
153     ListBoxRole,
154     ListBoxOptionRole,
155     ListItemRole,
156     ListMarkerRole,
157     MathElementRole,
158     MatteRole,
159     MenuRole,
160     MenuBarRole,
161     MenuButtonRole,
162     MenuItemRole,
163     MenuItemCheckboxRole,
164     MenuItemRadioRole,
165     MenuListPopupRole,
166     MenuListOptionRole,
167     OutlineRole,
168     ParagraphRole,
169     PopUpButtonRole,
170     PresentationalRole,
171     ProgressIndicatorRole,
172     RadioButtonRole,
173     RadioGroupRole,
174     RowHeaderRole,
175     RowRole,
176     RulerRole,
177     RulerMarkerRole,
178     ScrollAreaRole,
179     ScrollBarRole,
180     SheetRole,
181     SliderRole,
182     SliderThumbRole,
183     SpinButtonRole,
184     SpinButtonPartRole,
185     SplitGroupRole,
186     SplitterRole,
187     StaticTextRole,
188     SystemWideRole,
189     SVGRootRole,
190     TabGroupRole,
191     TabListRole,
192     TabPanelRole,            
193     TabRole,
194     TableRole,
195     TableHeaderContainerRole,
196     TextAreaRole,
197     TreeRole,
198     TreeGridRole,
199     TreeItemRole,
200     TextFieldRole,
201     ToggleButtonRole,
202     ToolbarRole,
203     UnknownRole,
204     UserInterfaceTooltipRole,
205     ValueIndicatorRole,
206     VideoRole,
207     WebAreaRole,
208     WebCoreLinkRole,
209     WindowRole,
210 };
211
212 enum AccessibilityTextSource {
213     AlternativeText,
214     ChildrenText,
215     SummaryText,
216     HelpText,
217     VisibleText,
218     TitleTagText,
219     PlaceholderText,
220     LabelByElementText,
221 };
222     
223 struct AccessibilityText {
224     String text;
225     AccessibilityTextSource textSource;
226     Vector<RefPtr<AccessibilityObject>> textElements;
227     
228     AccessibilityText(const String& t, const AccessibilityTextSource& s)
229     : text(t)
230     , textSource(s)
231     { }
232
233     AccessibilityText(const String& t, const AccessibilityTextSource& s, Vector<RefPtr<AccessibilityObject>> elements)
234     : text(t)
235     , textSource(s)
236     , textElements(WTF::move(elements))
237     { }
238
239     AccessibilityText(const String& t, const AccessibilityTextSource& s, const RefPtr<AccessibilityObject> element)
240     : text(t)
241     , textSource(s)
242     {
243         textElements.append(element);
244     }
245 };
246
247 struct AccessibilityTextUnderElementMode {
248     enum ChildrenInclusion {
249         TextUnderElementModeSkipIgnoredChildren,
250         TextUnderElementModeIncludeAllChildren,
251     };
252     
253     ChildrenInclusion childrenInclusion;
254     bool includeFocusableContent;
255     
256     AccessibilityTextUnderElementMode(ChildrenInclusion c = TextUnderElementModeSkipIgnoredChildren, bool i = false)
257     : childrenInclusion(c)
258     , includeFocusableContent(i)
259     { }
260 };
261     
262 enum AccessibilityOrientation {
263     AccessibilityOrientationVertical,
264     AccessibilityOrientationHorizontal,
265 };
266     
267 enum AccessibilityObjectInclusion {
268     IncludeObject,
269     IgnoreObject,
270     DefaultBehavior,
271 };
272     
273 enum AccessibilityButtonState {
274     ButtonStateOff = 0,
275     ButtonStateOn, 
276     ButtonStateMixed,
277 };
278     
279 enum AccessibilitySortDirection {
280     SortDirectionNone,
281     SortDirectionAscending,
282     SortDirectionDescending,
283     SortDirectionOther
284 };
285
286 enum AccessibilitySearchDirection {
287     SearchDirectionNext = 1,
288     SearchDirectionPrevious
289 };
290
291 enum AccessibilitySearchKey {
292     AnyTypeSearchKey = 1,
293     BlockquoteSameLevelSearchKey,
294     BlockquoteSearchKey,
295     BoldFontSearchKey,
296     ButtonSearchKey,
297     CheckBoxSearchKey,
298     ControlSearchKey,
299     DifferentTypeSearchKey,
300     FontChangeSearchKey,
301     FontColorChangeSearchKey,
302     FrameSearchKey,
303     GraphicSearchKey,
304     HeadingLevel1SearchKey,
305     HeadingLevel2SearchKey,
306     HeadingLevel3SearchKey,
307     HeadingLevel4SearchKey,
308     HeadingLevel5SearchKey,
309     HeadingLevel6SearchKey,
310     HeadingSameLevelSearchKey,
311     HeadingSearchKey,
312     HighlightedSearchKey,
313     ItalicFontSearchKey,
314     LandmarkSearchKey,
315     LinkSearchKey,
316     ListSearchKey,
317     LiveRegionSearchKey,
318     MisspelledWordSearchKey,
319     OutlineSearchKey,
320     PlainTextSearchKey,
321     RadioGroupSearchKey,
322     SameTypeSearchKey,
323     StaticTextSearchKey,
324     StyleChangeSearchKey,
325     TableSameLevelSearchKey,
326     TableSearchKey,
327     TextFieldSearchKey,
328     UnderlineSearchKey,
329     UnvisitedLinkSearchKey,
330     VisitedLinkSearchKey
331 };
332
333 enum AccessibilityVisiblePositionForBounds {
334     FirstVisiblePositionForBounds,
335     LastVisiblePositionForBounds
336 };
337
338 struct AccessibilitySearchCriteria {
339     AccessibilityObject* startObject;
340     AccessibilitySearchDirection searchDirection;
341     Vector<AccessibilitySearchKey> searchKeys;
342     String searchText;
343     unsigned resultsLimit;
344     bool visibleOnly;
345     bool immediateDescendantsOnly;
346     
347     AccessibilitySearchCriteria(AccessibilityObject* startObject, AccessibilitySearchDirection searchDirection, String searchText, unsigned resultsLimit, bool visibleOnly, bool immediateDescendantsOnly)
348         : startObject(startObject)
349         , searchDirection(searchDirection)
350         , searchText(searchText)
351         , resultsLimit(resultsLimit)
352         , visibleOnly(visibleOnly)
353         , immediateDescendantsOnly(immediateDescendantsOnly)
354     { }
355 };
356     
357 enum AccessibilityDetachmentType { CacheDestroyed, ElementDestroyed };
358
359 struct VisiblePositionRange {
360
361     VisiblePosition start;
362     VisiblePosition end;
363
364     VisiblePositionRange() {}
365
366     VisiblePositionRange(const VisiblePosition& s, const VisiblePosition& e)
367         : start(s)
368         , end(e)
369     { }
370
371     bool isNull() const { return start.isNull() || end.isNull(); }
372 };
373
374 struct PlainTextRange {
375         
376     unsigned start;
377     unsigned length;
378     
379     PlainTextRange()
380         : start(0)
381         , length(0)
382     { }
383     
384     PlainTextRange(unsigned s, unsigned l)
385         : start(s)
386         , length(l)
387     { }
388     
389     bool isNull() const { return !start && !length; }
390 };
391
392 enum AccessibilitySelectTextActivity {
393     FindAndReplaceActivity,
394     FindAndSelectActivity,
395     FindAndCapitalize,
396     FindAndLowercase,
397     FindAndUppercase
398 };
399
400 enum AccessibilitySelectTextAmbiguityResolution {
401     ClosestAfterSelectionAmbiguityResolution,
402     ClosestBeforeSelectionAmbiguityResolution,
403     ClosestToSelectionAmbiguityResolution
404 };
405
406 struct AccessibilitySelectTextCriteria {
407     AccessibilitySelectTextActivity activity;
408     AccessibilitySelectTextAmbiguityResolution ambiguityResolution;
409     String replacementString;
410     Vector<String> searchStrings;
411     
412     AccessibilitySelectTextCriteria(AccessibilitySelectTextActivity activity, AccessibilitySelectTextAmbiguityResolution ambiguityResolution, const String& replacementString)
413         : activity(activity)
414         , ambiguityResolution(ambiguityResolution)
415         , replacementString(replacementString)
416     { }
417 };
418
419 class AccessibilityObject : public RefCounted<AccessibilityObject> {
420 protected:
421     AccessibilityObject();
422     
423 public:
424     virtual ~AccessibilityObject();
425
426     // After constructing an AccessibilityObject, it must be given a
427     // unique ID, then added to AXObjectCache, and finally init() must
428     // be called last.
429     void setAXObjectID(AXID axObjectID) { m_id = axObjectID; }
430     virtual void init() { }
431
432     // When the corresponding WebCore object that this AccessibilityObject
433     // wraps is deleted, it must be detached.
434     virtual void detach(AccessibilityDetachmentType, AXObjectCache* cache = nullptr);
435     virtual bool isDetached() const;
436
437     typedef Vector<RefPtr<AccessibilityObject>> AccessibilityChildrenVector;
438     
439     virtual bool isAccessibilityNodeObject() const { return false; }    
440     virtual bool isAccessibilityRenderObject() const { return false; }
441     virtual bool isAccessibilityScrollbar() const { return false; }
442     virtual bool isAccessibilityScrollView() const { return false; }
443     virtual bool isAccessibilitySVGRoot() const { return false; }
444
445     bool accessibilityObjectContainsText(String *) const;
446     
447     virtual bool isAnchor() const { return false; }
448     virtual bool isAttachment() const { return false; }
449     virtual bool isHeading() const { return false; }
450     virtual bool isLink() const { return false; }
451     virtual bool isImage() const { return false; }
452     virtual bool isNativeImage() const { return false; }
453     virtual bool isImageButton() const { return false; }
454     virtual bool isPasswordField() const { return false; }
455     virtual bool isNativeTextControl() const { return false; }
456     virtual bool isSearchField() const { return false; }
457     bool isWebArea() const { return roleValue() == WebAreaRole; }
458     virtual bool isCheckbox() const { return roleValue() == CheckBoxRole; }
459     virtual bool isRadioButton() const { return roleValue() == RadioButtonRole; }
460     virtual bool isListBox() const { return roleValue() == ListBoxRole; }
461     virtual bool isListBoxOption() const { return false; }
462     virtual bool isMediaTimeline() const { return false; }
463     virtual bool isMenuRelated() const { return false; }
464     virtual bool isMenu() const { return false; }
465     virtual bool isMenuBar() const { return false; }
466     virtual bool isMenuButton() const { return false; }
467     virtual bool isMenuItem() const { return false; }
468     virtual bool isFileUploadButton() const { return false; }
469     virtual bool isInputImage() const { return false; }
470     virtual bool isProgressIndicator() const { return false; }
471     virtual bool isSlider() const { return false; }
472     virtual bool isSliderThumb() const { return false; }
473     virtual bool isInputSlider() const { return false; }
474     virtual bool isControl() const { return false; }
475     virtual bool isList() const { return false; }
476     virtual bool isTable() const { return false; }
477     virtual bool isAccessibilityTable() const { return false; }
478     virtual bool isDataTable() const { return false; }
479     virtual bool isTableRow() const { return false; }
480     virtual bool isTableColumn() const { return false; }
481     virtual bool isTableCell() const { return false; }
482     virtual bool isFieldset() const { return false; }
483     virtual bool isGroup() const { return false; }
484     virtual bool isARIATreeGridRow() const { return false; }
485     virtual bool isImageMapLink() const { return false; }
486     virtual bool isMenuList() const { return false; }
487     virtual bool isMenuListPopup() const { return false; }
488     virtual bool isMenuListOption() const { return false; }
489     virtual bool isSpinButton() const { return roleValue() == SpinButtonRole; }
490     virtual bool isNativeSpinButton() const { return false; }
491     virtual bool isSpinButtonPart() const { return false; }
492     virtual bool isMockObject() const { return false; }
493     virtual bool isMediaControlLabel() const { return false; }
494     bool isTextControl() const;
495     bool isARIATextControl() const;
496     bool isTabList() const { return roleValue() == TabListRole; }
497     bool isTabItem() const { return roleValue() == TabRole; }
498     bool isRadioGroup() const { return roleValue() == RadioGroupRole; }
499     bool isComboBox() const { return roleValue() == ComboBoxRole; }
500     bool isTree() const { return roleValue() == TreeRole; }
501     bool isTreeItem() const { return roleValue() == TreeItemRole; }
502     bool isScrollbar() const { return roleValue() == ScrollBarRole; }
503     bool isButton() const;
504     bool isListItem() const { return roleValue() == ListItemRole; }
505     bool isCheckboxOrRadio() const { return isCheckbox() || isRadioButton(); }
506     bool isScrollView() const { return roleValue() == ScrollAreaRole; }
507     bool isCanvas() const { return roleValue() == CanvasRole; }
508     bool isPopUpButton() const { return roleValue() == PopUpButtonRole; }
509     bool isBlockquote() const;
510     bool isLandmark() const;
511     bool isColorWell() const { return roleValue() == ColorWellRole; }
512     bool isRangeControl() const;
513     bool isMeter() const;
514
515     virtual bool isChecked() const { return false; }
516     virtual bool isEnabled() const { return false; }
517     virtual bool isSelected() const { return false; }
518     virtual bool isFocused() const { return false; }
519     virtual bool isHovered() const { return false; }
520     virtual bool isIndeterminate() const { return false; }
521     virtual bool isLoaded() const { return false; }
522     virtual bool isMultiSelectable() const { return false; }
523     virtual bool isOffScreen() const { return false; }
524     virtual bool isPressed() const { return false; }
525     virtual bool isReadOnly() const { return false; }
526     virtual bool isUnvisited() const { return false; }
527     virtual bool isVisited() const { return false; }
528     virtual bool isRequired() const { return false; }
529     virtual bool supportsRequiredAttribute() const { return false; }
530     virtual bool isLinked() const { return false; }
531     virtual bool isExpanded() const;
532     virtual bool isVisible() const { return true; }
533     virtual bool isCollapsed() const { return false; }
534     virtual void setIsExpanded(bool) { }
535
536     // In a multi-select list, many items can be selected but only one is active at a time.
537     virtual bool isSelectedOptionActive() const { return false; }
538
539     virtual bool hasBoldFont() const { return false; }
540     virtual bool hasItalicFont() const { return false; }
541     bool hasMisspelling() const;
542     virtual bool hasPlainText() const { return false; }
543     virtual bool hasSameFont(RenderObject*) const { return false; }
544     virtual bool hasSameFontColor(RenderObject*) const { return false; }
545     virtual bool hasSameStyle(RenderObject*) const { return false; }
546     bool isStaticText() const { return roleValue() == StaticTextRole; }
547     virtual bool hasUnderline() const { return false; }
548     bool hasHighlighting() const;
549
550     virtual bool canSetFocusAttribute() const { return false; }
551     virtual bool canSetTextRangeAttributes() const { return false; }
552     virtual bool canSetValueAttribute() const { return false; }
553     virtual bool canSetNumericValue() const { return false; }
554     virtual bool canSetSelectedAttribute() const { return false; }
555     virtual bool canSetSelectedChildrenAttribute() const { return false; }
556     virtual bool canSetExpandedAttribute() const { return false; }
557     
558     Element* element() const;
559     virtual Node* node() const { return nullptr; }
560     virtual RenderObject* renderer() const { return nullptr; }
561     virtual bool accessibilityIsIgnored() const;
562     virtual AccessibilityObjectInclusion defaultObjectInclusion() const;
563     bool accessibilityIsIgnoredByDefault() const;
564     
565     int blockquoteLevel() const;
566     virtual int headingLevel() const { return 0; }
567     virtual int tableLevel() const { return 0; }
568     virtual AccessibilityButtonState checkboxOrRadioValue() const;
569     virtual String valueDescription() const { return String(); }
570     virtual float valueForRange() const { return 0.0f; }
571     virtual float maxValueForRange() const { return 0.0f; }
572     virtual float minValueForRange() const { return 0.0f; }
573     virtual float stepValueForRange() const { return 0.0f; }
574     virtual AccessibilityObject* selectedRadioButton() { return nullptr; }
575     virtual AccessibilityObject* selectedTabItem() { return nullptr; }
576     virtual int layoutCount() const { return 0; }
577     virtual double estimatedLoadingProgress() const { return 0; }
578     static bool isARIAControl(AccessibilityRole);
579     static bool isARIAInput(AccessibilityRole);
580     virtual bool supportsARIAOwns() const { return false; }
581     virtual void ariaOwnsElements(AccessibilityChildrenVector&) const { }
582     virtual bool supportsARIAFlowTo() const { return false; }
583     virtual void ariaFlowToElements(AccessibilityChildrenVector&) const { }
584     virtual bool supportsARIADescribedBy() const { return false; }
585     virtual void ariaDescribedByElements(AccessibilityChildrenVector&) const { }
586     virtual bool supportsARIAControls() const { return false; }
587     virtual void ariaControlsElements(AccessibilityChildrenVector&) const { }
588     virtual bool ariaHasPopup() const { return false; }
589     virtual bool ariaPressedIsPresent() const;
590     bool ariaIsMultiline() const;
591     String invalidStatus() const;
592     bool supportsARIAExpanded() const;
593     bool supportsChecked() const;
594     AccessibilitySortDirection sortDirection() const;
595     virtual bool canvasHasFallbackContent() const { return false; }
596     bool supportsRangeValue() const;
597     String identifierAttribute() const;
598     void classList(Vector<String>&) const;
599     
600     bool supportsARIASetSize() const;
601     bool supportsARIAPosInSet() const;
602     int ariaSetSize() const;
603     int ariaPosInSet() const;
604     
605     // ARIA drag and drop
606     virtual bool supportsARIADropping() const { return false; }
607     virtual bool supportsARIADragging() const { return false; }
608     virtual bool isARIAGrabbed() { return false; }
609     virtual void setARIAGrabbed(bool) { }
610     virtual void determineARIADropEffects(Vector<String>&) { }
611     
612     // Called on the root AX object to return the deepest available element.
613     virtual AccessibilityObject* accessibilityHitTest(const IntPoint&) const { return nullptr; }
614     // Called on the AX object after the render tree determines which is the right AccessibilityRenderObject.
615     virtual AccessibilityObject* elementAccessibilityHitTest(const IntPoint&) const;
616
617     virtual AccessibilityObject* focusedUIElement() const;
618
619     virtual AccessibilityObject* firstChild() const { return nullptr; }
620     virtual AccessibilityObject* lastChild() const { return nullptr; }
621     virtual AccessibilityObject* previousSibling() const { return nullptr; }
622     virtual AccessibilityObject* nextSibling() const { return nullptr; }
623     virtual AccessibilityObject* parentObject() const = 0;
624     virtual AccessibilityObject* parentObjectUnignored() const;
625     virtual AccessibilityObject* parentObjectIfExists() const { return nullptr; }
626     static AccessibilityObject* firstAccessibleObjectFromNode(const Node*);
627     void findMatchingObjects(AccessibilitySearchCriteria*, AccessibilityChildrenVector&);
628     virtual bool isDescendantOfBarrenParent() const { return false; }
629     
630     // Text selection
631     PassRefPtr<Range> rangeOfStringClosestToRangeInDirection(Range*, AccessibilitySearchDirection, Vector<String>&) const;
632     PassRefPtr<Range> selectionRange() const;
633     String selectText(AccessibilitySelectTextCriteria*);
634     
635     virtual AccessibilityObject* observableObject() const { return nullptr; }
636     virtual void linkedUIElements(AccessibilityChildrenVector&) const { }
637     virtual AccessibilityObject* titleUIElement() const { return nullptr; }
638     virtual bool exposesTitleUIElement() const { return true; }
639     virtual AccessibilityObject* correspondingLabelForControlElement() const { return nullptr; }
640     virtual AccessibilityObject* correspondingControlForLabelElement() const { return nullptr; }
641     virtual AccessibilityObject* scrollBar(AccessibilityOrientation) { return nullptr; }
642     
643     virtual AccessibilityRole ariaRoleAttribute() const { return UnknownRole; }
644     virtual bool isPresentationalChildOfAriaRole() const { return false; }
645     virtual bool ariaRoleHasPresentationalChildren() const { return false; }
646     virtual bool inheritsPresentationalRole() const { return false; }
647
648     // Accessibility Text
649     virtual void accessibilityText(Vector<AccessibilityText>&) { };
650
651     // A programmatic way to set a name on an AccessibleObject.
652     virtual void setAccessibleName(const AtomicString&) { }
653     virtual bool hasAttributesRequiredForInclusion() const;
654
655     // Accessibility Text - (To be deprecated).
656     virtual String accessibilityDescription() const { return String(); }
657     virtual String title() const { return String(); }
658     virtual String helpText() const { return String(); }
659
660     // Methods for determining accessibility text.
661     virtual String stringValue() const { return String(); }
662     virtual String textUnderElement(AccessibilityTextUnderElementMode = AccessibilityTextUnderElementMode()) const { return String(); }
663     virtual String text() const { return String(); }
664     virtual int textLength() const { return 0; }
665     virtual String ariaLabeledByAttribute() const { return String(); }
666     virtual String ariaDescribedByAttribute() const { return String(); }
667     const AtomicString& placeholderValue() const;
668     
669     // Abbreviations
670     virtual String expandedTextValue() const { return String(); }
671     virtual bool supportsExpandedTextValue() const { return false; }
672     
673     void elementsFromAttribute(Vector<Element*>&, const QualifiedName&) const;
674
675     // Only if isColorWell()
676     virtual void colorValue(int& r, int& g, int& b) const { r = 0; g = 0; b = 0; }
677
678     void setRoleValue(AccessibilityRole role) { m_role = role; }
679     virtual AccessibilityRole roleValue() const { return m_role; }
680
681     virtual AXObjectCache* axObjectCache() const;
682     AXID axObjectID() const { return m_id; }
683     
684     static AccessibilityObject* anchorElementForNode(Node*);
685     static AccessibilityObject* headingElementForNode(Node*);
686     virtual Element* anchorElement() const { return nullptr; }
687     virtual Element* actionElement() const { return nullptr; }
688     virtual LayoutRect boundingBoxRect() const { return LayoutRect(); }
689     IntRect pixelSnappedBoundingBoxRect() const { return pixelSnappedIntRect(boundingBoxRect()); }
690     virtual LayoutRect elementRect() const = 0;
691     IntRect pixelSnappedElementRect() const { return pixelSnappedIntRect(elementRect()); }
692     LayoutSize size() const { return elementRect().size(); }
693     IntSize pixelSnappedSize() const { return elementRect().pixelSnappedSize(); }
694     virtual IntPoint clickPoint();
695     static IntRect boundingBoxForQuads(RenderObject*, const Vector<FloatQuad>&);
696     virtual Path elementPath() const { return Path(); }
697     virtual bool supportsPath() const { return false; }
698     
699     TextIteratorBehavior textIteratorBehaviorForTextRange() const;
700     virtual PlainTextRange selectedTextRange() const { return PlainTextRange(); }
701     unsigned selectionStart() const { return selectedTextRange().start; }
702     unsigned selectionEnd() const { return selectedTextRange().length; }
703     
704     virtual URL url() const { return URL(); }
705     virtual VisibleSelection selection() const { return VisibleSelection(); }
706     virtual String selectedText() const { return String(); }
707     virtual const AtomicString& accessKey() const { return nullAtom; }
708     const String& actionVerb() const;
709     virtual Widget* widget() const { return nullptr; }
710     virtual Widget* widgetForAttachmentView() const { return nullptr; }
711     Page* page() const;
712     virtual Document* document() const;
713     virtual FrameView* documentFrameView() const;
714     Frame* frame() const;
715     MainFrame* mainFrame() const;
716     Document* topDocument() const;
717     ScrollView* scrollViewAncestor() const;
718     String language() const;
719     // 1-based, to match the aria-level spec.
720     virtual unsigned hierarchicalLevel() const { return 0; }
721     
722     virtual void setFocused(bool) { }
723     virtual void setSelectedText(const String&) { }
724     virtual void setSelectedTextRange(const PlainTextRange&) { }
725     virtual void setValue(const String&) { }
726     virtual void setValue(float) { }
727     virtual void setSelected(bool) { }
728     virtual void setSelectedRows(AccessibilityChildrenVector&) { }
729     
730     virtual void makeRangeVisible(const PlainTextRange&) { }
731     virtual bool press();
732     bool performDefaultAction() { return press(); }
733     
734     virtual AccessibilityOrientation orientation() const;
735     virtual void increment() { }
736     virtual void decrement() { }
737
738     virtual void childrenChanged() { }
739     virtual void textChanged() { }
740     virtual void updateAccessibilityRole() { }
741     const AccessibilityChildrenVector& children(bool updateChildrenIfNeeded = true);
742     virtual void addChildren() { }
743     virtual void addChild(AccessibilityObject*) { }
744     virtual void insertChild(AccessibilityObject*, unsigned) { }
745     
746     virtual bool canHaveChildren() const { return true; }
747     virtual bool hasChildren() const { return m_haveChildren; }
748     virtual void updateChildrenIfNecessary();
749     virtual void setNeedsToUpdateChildren() { }
750     virtual void clearChildren();
751 #if PLATFORM(COCOA)
752     virtual void detachFromParent();
753 #else
754     virtual void detachFromParent() { }
755 #endif
756
757     virtual void selectedChildren(AccessibilityChildrenVector&) { }
758     virtual void visibleChildren(AccessibilityChildrenVector&) { }
759     virtual void tabChildren(AccessibilityChildrenVector&) { }
760     virtual bool shouldFocusActiveDescendant() const { return false; }
761     virtual AccessibilityObject* activeDescendant() const { return nullptr; }
762     virtual void handleActiveDescendantChanged() { }
763     virtual void handleAriaExpandedChanged() { }
764     bool isDescendantOfObject(const AccessibilityObject*) const;
765     bool isAncestorOfObject(const AccessibilityObject*) const;
766     AccessibilityObject* firstAnonymousBlockChild() const;
767
768     static AccessibilityRole ariaRoleToWebCoreRole(const String&);
769     bool hasAttribute(const QualifiedName&) const;
770     const AtomicString& getAttribute(const QualifiedName&) const;
771     bool hasTagName(const QualifiedName&) const;
772
773     virtual VisiblePositionRange visiblePositionRange() const { return VisiblePositionRange(); }
774     virtual VisiblePositionRange visiblePositionRangeForLine(unsigned) const { return VisiblePositionRange(); }
775     
776     VisiblePositionRange visiblePositionRangeForUnorderedPositions(const VisiblePosition&, const VisiblePosition&) const;
777     VisiblePositionRange positionOfLeftWord(const VisiblePosition&) const;
778     VisiblePositionRange positionOfRightWord(const VisiblePosition&) const;
779     VisiblePositionRange leftLineVisiblePositionRange(const VisiblePosition&) const;
780     VisiblePositionRange rightLineVisiblePositionRange(const VisiblePosition&) const;
781     VisiblePositionRange sentenceForPosition(const VisiblePosition&) const;
782     VisiblePositionRange paragraphForPosition(const VisiblePosition&) const;
783     VisiblePositionRange styleRangeForPosition(const VisiblePosition&) const;
784     VisiblePositionRange visiblePositionRangeForRange(const PlainTextRange&) const;
785     VisiblePositionRange lineRangeForPosition(const VisiblePosition&) const;
786
787     String stringForVisiblePositionRange(const VisiblePositionRange&) const;
788     virtual IntRect boundsForVisiblePositionRange(const VisiblePositionRange&) const { return IntRect(); }
789     int lengthForVisiblePositionRange(const VisiblePositionRange&) const;
790     virtual void setSelectedVisiblePositionRange(const VisiblePositionRange&) const { }
791
792     VisiblePosition visiblePositionForBounds(const IntRect&, AccessibilityVisiblePositionForBounds) const;
793     virtual VisiblePosition visiblePositionForPoint(const IntPoint&) const { return VisiblePosition(); }
794     VisiblePosition nextVisiblePosition(const VisiblePosition& visiblePos) const { return visiblePos.next(); }
795     VisiblePosition previousVisiblePosition(const VisiblePosition& visiblePos) const { return visiblePos.previous(); }
796     VisiblePosition nextWordEnd(const VisiblePosition&) const;
797     VisiblePosition previousWordStart(const VisiblePosition&) const;
798     VisiblePosition nextLineEndPosition(const VisiblePosition&) const;
799     VisiblePosition previousLineStartPosition(const VisiblePosition&) const;
800     VisiblePosition nextSentenceEndPosition(const VisiblePosition&) const;
801     VisiblePosition previousSentenceStartPosition(const VisiblePosition&) const;
802     VisiblePosition nextParagraphEndPosition(const VisiblePosition&) const;
803     VisiblePosition previousParagraphStartPosition(const VisiblePosition&) const;
804     virtual VisiblePosition visiblePositionForIndex(unsigned, bool /*lastIndexOK */) const { return VisiblePosition(); }
805     
806     virtual VisiblePosition visiblePositionForIndex(int) const { return VisiblePosition(); }
807     virtual int indexForVisiblePosition(const VisiblePosition&) const { return 0; }
808
809     AccessibilityObject* accessibilityObjectForPosition(const VisiblePosition&) const;
810     int lineForPosition(const VisiblePosition&) const;
811     PlainTextRange plainTextRangeForVisiblePositionRange(const VisiblePositionRange&) const;
812     virtual int index(const VisiblePosition&) const { return -1; }
813
814     virtual void lineBreaks(Vector<int>&) const { }
815     virtual PlainTextRange doAXRangeForLine(unsigned) const { return PlainTextRange(); }
816     PlainTextRange doAXRangeForPosition(const IntPoint&) const;
817     virtual PlainTextRange doAXRangeForIndex(unsigned) const { return PlainTextRange(); }
818     PlainTextRange doAXStyleRangeForIndex(unsigned) const;
819
820     virtual String doAXStringForRange(const PlainTextRange&) const { return String(); }
821     virtual IntRect doAXBoundsForRange(const PlainTextRange&) const { return IntRect(); }
822     String listMarkerTextForNodeAndPosition(Node*, const VisiblePosition&) const;
823
824     unsigned doAXLineForIndex(unsigned);
825
826     String computedRoleString() const;
827
828     virtual String stringValueForMSAA() const { return String(); }
829     virtual String stringRoleForMSAA() const { return String(); }
830     virtual String nameForMSAA() const { return String(); }
831     virtual String descriptionForMSAA() const { return String(); }
832     virtual AccessibilityRole roleValueForMSAA() const { return roleValue(); }
833
834     virtual String passwordFieldValue() const { return String(); }
835
836     // Used by an ARIA tree to get all its rows.
837     void ariaTreeRows(AccessibilityChildrenVector&);
838     // Used by an ARIA tree item to get all of its direct rows that it can disclose.
839     void ariaTreeItemDisclosedRows(AccessibilityChildrenVector&);
840     // Used by an ARIA tree item to get only its content, and not its child tree items and groups. 
841     void ariaTreeItemContent(AccessibilityChildrenVector&);
842     
843     // ARIA live-region features.
844     bool supportsARIALiveRegion() const;
845     bool isInsideARIALiveRegion() const;
846     virtual const String ariaLiveRegionStatus() const { return String(); }
847     virtual const AtomicString& ariaLiveRegionRelevant() const { return nullAtom; }
848     virtual bool ariaLiveRegionAtomic() const { return false; }
849     virtual bool ariaLiveRegionBusy() const { return false; }
850     static const String defaultLiveRegionStatusForRole(AccessibilityRole);
851     static bool liveRegionStatusIsEnabled(const AtomicString&);
852     static bool contentEditableAttributeIsEnabled(Element*);
853     bool hasContentEditableAttributeSet() const;
854     
855     bool supportsARIAAttributes() const;
856     
857     // CSS3 Speech properties.
858     virtual ESpeak speakProperty() const { return SpeakNormal; }
859
860     // Make this object visible by scrolling as many nested scrollable views as needed.
861     virtual void scrollToMakeVisible() const;
862     // Same, but if the whole object can't be made visible, try for this subrect, in local coordinates.
863     virtual void scrollToMakeVisibleWithSubFocus(const IntRect&) const;
864     // Scroll this object to a given point in global coordinates of the top-level window.
865     virtual void scrollToGlobalPoint(const IntPoint&) const;
866
867     bool lastKnownIsIgnoredValue();
868     void setLastKnownIsIgnoredValue(bool);
869
870     // Fires a children changed notification on the parent if the isIgnored value changed.
871     void notifyIfIgnoredValueChanged();
872
873     // All math elements return true for isMathElement().
874     virtual bool isMathElement() const { return false; }
875     virtual bool isMathFraction() const { return false; }
876     virtual bool isMathFenced() const { return false; }
877     virtual bool isMathSubscriptSuperscript() const { return false; }
878     virtual bool isMathRow() const { return false; }
879     virtual bool isMathUnderOver() const { return false; }
880     virtual bool isMathRoot() const { return false; }
881     virtual bool isMathSquareRoot() const { return false; }
882     virtual bool isMathText() const { return false; }
883     virtual bool isMathNumber() const { return false; }
884     virtual bool isMathOperator() const { return false; }
885     virtual bool isMathFenceOperator() const { return false; }
886     virtual bool isMathSeparatorOperator() const { return false; }
887     virtual bool isMathIdentifier() const { return false; }
888     virtual bool isMathTable() const { return false; }
889     virtual bool isMathTableRow() const { return false; }
890     virtual bool isMathTableCell() const { return false; }
891     virtual bool isMathMultiscript() const { return false; }
892
893     // Root components.
894     virtual AccessibilityObject* mathRadicandObject() { return nullptr; }
895     virtual AccessibilityObject* mathRootIndexObject() { return nullptr; }
896     
897     // Under over components.
898     virtual AccessibilityObject* mathUnderObject() { return nullptr; }
899     virtual AccessibilityObject* mathOverObject() { return nullptr; }
900
901     // Fraction components.
902     virtual AccessibilityObject* mathNumeratorObject() { return nullptr; }
903     virtual AccessibilityObject* mathDenominatorObject() { return nullptr; }
904
905     // Subscript/superscript components.
906     virtual AccessibilityObject* mathBaseObject() { return nullptr; }
907     virtual AccessibilityObject* mathSubscriptObject() { return nullptr; }
908     virtual AccessibilityObject* mathSuperscriptObject() { return nullptr; }
909     
910     // Fenced components.
911     virtual String mathFencedOpenString() const { return String(); }
912     virtual String mathFencedCloseString() const { return String(); }
913     virtual int mathLineThickness() const { return 0; }
914     
915     // Multiscripts components.
916     typedef Vector<std::pair<AccessibilityObject*, AccessibilityObject*>> AccessibilityMathMultiscriptPairs;
917     virtual void mathPrescripts(AccessibilityMathMultiscriptPairs&) { }
918     virtual void mathPostscripts(AccessibilityMathMultiscriptPairs&) { }
919     
920     // Visibility.
921     bool isARIAHidden() const;
922     bool isDOMHidden() const;
923     bool isHidden() const { return isARIAHidden() || isDOMHidden(); }
924     
925 #if HAVE(ACCESSIBILITY)
926 #if PLATFORM(GTK) || PLATFORM(EFL)
927     AccessibilityObjectWrapper* wrapper() const;
928     void setWrapper(AccessibilityObjectWrapper*);
929 #else
930     AccessibilityObjectWrapper* wrapper() const { return m_wrapper.get(); }
931     void setWrapper(AccessibilityObjectWrapper* wrapper) 
932     {
933         m_wrapper = wrapper;
934     }
935 #endif
936 #endif
937     
938 #if PLATFORM(COCOA)
939     void overrideAttachmentParent(AccessibilityObject* parent);
940 #else
941     void overrideAttachmentParent(AccessibilityObject*) { }
942 #endif
943     
944 #if HAVE(ACCESSIBILITY)
945     // a platform-specific method for determining if an attachment is ignored
946     bool accessibilityIgnoreAttachment() const;
947     // gives platforms the opportunity to indicate if and how an object should be included
948     AccessibilityObjectInclusion accessibilityPlatformIncludesObject() const;
949 #else
950     bool accessibilityIgnoreAttachment() const { return true; }
951     AccessibilityObjectInclusion accessibilityPlatformIncludesObject() const { return DefaultBehavior; }
952 #endif
953
954 #if PLATFORM(IOS)
955     int accessibilityPasswordFieldLength();
956 #endif
957     
958     // allows for an AccessibilityObject to update its render tree or perform
959     // other operations update type operations
960     void updateBackingStore();
961     
962 protected:
963     AXID m_id;
964     AccessibilityChildrenVector m_children;
965     mutable bool m_haveChildren;
966     AccessibilityRole m_role;
967     AccessibilityObjectInclusion m_lastKnownIsIgnoredValue;
968
969     virtual bool computeAccessibilityIsIgnored() const { return true; }
970
971     // If this object itself scrolls, return its ScrollableArea.
972     virtual ScrollableArea* getScrollableAreaIfScrollable() const { return nullptr; }
973     virtual void scrollTo(const IntPoint&) const { }
974
975     static bool isAccessibilityObjectSearchMatchAtIndex(AccessibilityObject*, AccessibilitySearchCriteria*, size_t);
976     static bool isAccessibilityObjectSearchMatch(AccessibilityObject*, AccessibilitySearchCriteria*);
977     static bool isAccessibilityTextSearchMatch(AccessibilityObject*, AccessibilitySearchCriteria*);
978     static bool objectMatchesSearchCriteriaWithResultLimit(AccessibilityObject*, AccessibilitySearchCriteria*, AccessibilityChildrenVector&);
979     virtual AccessibilityRole buttonRoleType() const;
980     bool isOnscreen() const;
981     
982 #if (PLATFORM(GTK) || PLATFORM(EFL)) && HAVE(ACCESSIBILITY)
983     bool allowsTextRanges() const;
984     unsigned getLengthForTextRange() const;
985 #else
986     bool allowsTextRanges() const { return isTextControl(); }
987     unsigned getLengthForTextRange() const { return text().length(); }
988 #endif
989
990 #if PLATFORM(COCOA)
991     RetainPtr<WebAccessibilityObjectWrapper> m_wrapper;
992 #elif PLATFORM(WIN)
993     COMPtr<AccessibilityObjectWrapper> m_wrapper;
994 #elif PLATFORM(GTK) || (PLATFORM(EFL) && HAVE(ACCESSIBILITY))
995     AtkObject* m_wrapper;
996 #endif
997 };
998
999 #if !HAVE(ACCESSIBILITY)
1000 inline const AccessibilityObject::AccessibilityChildrenVector& AccessibilityObject::children(bool) { return m_children; }
1001 inline const String& AccessibilityObject::actionVerb() const { return emptyString(); }
1002 inline int AccessibilityObject::lineForPosition(const VisiblePosition&) const { return -1; }
1003 inline void AccessibilityObject::updateBackingStore() { }
1004 #endif
1005
1006 #define ACCESSIBILITY_OBJECT_TYPE_CASTS(ToValueTypeName, predicate) \
1007     TYPE_CASTS_BASE(ToValueTypeName, AccessibilityObject, object, object->predicate, object.predicate)
1008
1009 } // namespace WebCore
1010
1011 #endif // AccessibilityObject_h