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
52typedef struct _NSRange NSRange;
53
54OBJC_CLASS NSArray;
55OBJC_CLASS NSAttributedString;
56OBJC_CLASS NSData;
57OBJC_CLASS NSMutableAttributedString;
58OBJC_CLASS NSString;
59OBJC_CLASS NSValue;
60OBJC_CLASS NSView;
61OBJC_CLASS WebAccessibilityObjectWrapper;
62
63typedef WebAccessibilityObjectWrapper AccessibilityObjectWrapper;
64
65#elif PLATFORM(GTK) || (PLATFORM(EFL) && HAVE(ACCESSIBILITY))
66typedef struct _AtkObject AtkObject;
67typedef struct _AtkObject AccessibilityObjectWrapper;
68#else
69class AccessibilityObjectWrapper;
70#endif
71
72namespace WebCore {
73
74class AccessibilityObject;
75class AXObjectCache;
76class Element;
77class Frame;
78class FrameView;
79class HTMLAnchorElement;
80class HTMLAreaElement;
81class IntPoint;
82class IntSize;
83class MainFrame;
84class Node;
85class Page;
86class RenderObject;
87class RenderListItem;
88class ScrollableArea;
89class ScrollView;
90class Widget;
91
92typedef unsigned AXID;
93
94enum 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
212enum AccessibilityTextSource {
213    AlternativeText,
214    ChildrenText,
215    SummaryText,
216    HelpText,
217    VisibleText,
218    TitleTagText,
219    PlaceholderText,
220    LabelByElementText,
221};
222
223struct 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
247struct 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
262enum AccessibilityOrientation {
263    AccessibilityOrientationVertical,
264    AccessibilityOrientationHorizontal,
265};
266
267enum AccessibilityObjectInclusion {
268    IncludeObject,
269    IgnoreObject,
270    DefaultBehavior,
271};
272
273enum AccessibilityButtonState {
274    ButtonStateOff = 0,
275    ButtonStateOn,
276    ButtonStateMixed,
277};
278
279enum AccessibilitySortDirection {
280    SortDirectionNone,
281    SortDirectionAscending,
282    SortDirectionDescending,
283    SortDirectionOther
284};
285
286enum AccessibilitySearchDirection {
287    SearchDirectionNext = 1,
288    SearchDirectionPrevious
289};
290
291enum 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
333enum AccessibilityVisiblePositionForBounds {
334    FirstVisiblePositionForBounds,
335    LastVisiblePositionForBounds
336};
337
338struct 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
357enum AccessibilityDetachmentType { CacheDestroyed, ElementDestroyed };
358
359struct 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
374struct 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
392enum AccessibilitySelectTextActivity {
393    FindAndReplaceActivity,
394    FindAndSelectActivity,
395    FindAndCapitalize,
396    FindAndLowercase,
397    FindAndUppercase
398};
399
400enum AccessibilitySelectTextAmbiguityResolution {
401    ClosestAfterSelectionAmbiguityResolution,
402    ClosestBeforeSelectionAmbiguityResolution,
403    ClosestToSelectionAmbiguityResolution
404};
405
406struct 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
419class AccessibilityObject : public RefCounted<AccessibilityObject> {
420protected:
421    AccessibilityObject();
422
423public:
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 0; }
560    virtual RenderObject* renderer() const { return 0; }
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 0; }
575    virtual AccessibilityObject* selectedTabItem() { return 0; }
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 0; }
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 0; }
620    virtual AccessibilityObject* lastChild() const { return 0; }
621    virtual AccessibilityObject* previousSibling() const { return 0; }
622    virtual AccessibilityObject* nextSibling() const { return 0; }
623    virtual AccessibilityObject* parentObject() const = 0;
624    virtual AccessibilityObject* parentObjectUnignored() const;
625    virtual AccessibilityObject* parentObjectIfExists() const { return 0; }
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 0; }
636    virtual void linkedUIElements(AccessibilityChildrenVector&) const { }
637    virtual AccessibilityObject* titleUIElement() const { return 0; }
638    virtual bool exposesTitleUIElement() const { return true; }
639    virtual AccessibilityObject* correspondingLabelForControlElement() const { return 0; }
640    virtual AccessibilityObject* correspondingControlForLabelElement() const { return 0; }
641    virtual AccessibilityObject* scrollBar(AccessibilityOrientation) { return 0; }
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 0; }
687    virtual Element* actionElement() const { return 0; }
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 0; }
710    virtual Widget* widgetForAttachmentView() const { return 0; }
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 0; }
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 0; }
895    virtual AccessibilityObject* mathRootIndexObject() { return 0; }
896
897    // Under over components.
898    virtual AccessibilityObject* mathUnderObject() { return 0; }
899    virtual AccessibilityObject* mathOverObject() { return 0; }
900
901    // Fraction components.
902    virtual AccessibilityObject* mathNumeratorObject() { return 0; }
903    virtual AccessibilityObject* mathDenominatorObject() { return 0; }
904
905    // Subscript/superscript components.
906    virtual AccessibilityObject* mathBaseObject() { return 0; }
907    virtual AccessibilityObject* mathSubscriptObject() { return 0; }
908    virtual AccessibilityObject* mathSuperscriptObject() { return 0; }
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
962protected:
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 0; }
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)
1000inline const AccessibilityObject::AccessibilityChildrenVector& AccessibilityObject::children(bool) { return m_children; }
1001inline const String& AccessibilityObject::actionVerb() const { return emptyString(); }
1002inline int AccessibilityObject::lineForPosition(const VisiblePosition&) const { return -1; }
1003inline 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
1012