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