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