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