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