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