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