6da9bcd21ab69d5007225817f6a38b004401937c
[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 isNativeSpinButton() const { return false; }
423     virtual bool isSpinButtonPart() const { return false; }
424     virtual bool isMockObject() const { return false; }
425     virtual bool isMediaControlLabel() const { return false; }
426     bool isTextControl() const;
427     bool isARIATextControl() const;
428     bool isTabList() const { return roleValue() == TabListRole; }
429     bool isTabItem() const { return roleValue() == TabRole; }
430     bool isRadioGroup() const { return roleValue() == RadioGroupRole; }
431     bool isComboBox() const { return roleValue() == ComboBoxRole; }
432     bool isTree() const { return roleValue() == TreeRole; }
433     bool isTreeItem() const { return roleValue() == TreeItemRole; }
434     bool isScrollbar() const { return roleValue() == ScrollBarRole; }
435     bool isButton() const;
436     bool isListItem() const { return roleValue() == ListItemRole; }
437     bool isCheckboxOrRadio() const { return isCheckbox() || isRadioButton(); }
438     bool isScrollView() const { return roleValue() == ScrollAreaRole; }
439     bool isCanvas() const { return roleValue() == CanvasRole; }
440     bool isPopUpButton() const { return roleValue() == PopUpButtonRole; }
441     bool isBlockquote() const;
442     bool isLandmark() const;
443     bool isColorWell() const { return roleValue() == ColorWellRole; }
444     
445     virtual bool isChecked() const { return false; }
446     virtual bool isEnabled() const { return false; }
447     virtual bool isSelected() const { return false; }
448     virtual bool isFocused() const { return false; }
449     virtual bool isHovered() const { return false; }
450     virtual bool isIndeterminate() const { return false; }
451     virtual bool isLoaded() const { return false; }
452     virtual bool isMultiSelectable() const { return false; }
453     virtual bool isOffScreen() const { return false; }
454     virtual bool isPressed() const { return false; }
455     virtual bool isReadOnly() const { return false; }
456     virtual bool isUnvisited() const { return false; }
457     virtual bool isVisited() const { return false; }
458     virtual bool isRequired() const { return false; }
459     virtual bool isLinked() const { return false; }
460     virtual bool isExpanded() const;
461     virtual bool isVisible() const { return true; }
462     virtual bool isCollapsed() const { return false; }
463     virtual void setIsExpanded(bool) { }
464
465     // In a multi-select list, many items can be selected but only one is active at a time.
466     virtual bool isSelectedOptionActive() const { return false; }
467
468     virtual bool hasBoldFont() const { return false; }
469     virtual bool hasItalicFont() const { return false; }
470     bool hasMisspelling() const;
471     virtual bool hasPlainText() const { return false; }
472     virtual bool hasSameFont(RenderObject*) const { return false; }
473     virtual bool hasSameFontColor(RenderObject*) const { return false; }
474     virtual bool hasSameStyle(RenderObject*) const { return false; }
475     bool hasStaticText() const { return roleValue() == StaticTextRole; }
476     virtual bool hasUnderline() const { return false; }
477     bool hasHighlighting() const;
478
479     virtual bool canSetFocusAttribute() const { return false; }
480     virtual bool canSetTextRangeAttributes() const { return false; }
481     virtual bool canSetValueAttribute() const { return false; }
482     virtual bool canSetNumericValue() const { return false; }
483     virtual bool canSetSelectedAttribute() const { return false; }
484     virtual bool canSetSelectedChildrenAttribute() const { return false; }
485     virtual bool canSetExpandedAttribute() const { return false; }
486     
487     virtual Node* node() const { return 0; }
488     virtual RenderObject* renderer() const { return 0; }
489     virtual bool accessibilityIsIgnored() const;
490     virtual AccessibilityObjectInclusion defaultObjectInclusion() const;
491     bool accessibilityIsIgnoredByDefault() const;
492     
493     int blockquoteLevel() const;
494     virtual int headingLevel() const { return 0; }
495     virtual int tableLevel() const { return 0; }
496     virtual AccessibilityButtonState checkboxOrRadioValue() const;
497     virtual String valueDescription() const { return String(); }
498     virtual float valueForRange() const { return 0.0f; }
499     virtual float maxValueForRange() const { return 0.0f; }
500     virtual float minValueForRange() const { return 0.0f; }
501     virtual float stepValueForRange() const { return 0.0f; }
502     virtual AccessibilityObject* selectedRadioButton() { return 0; }
503     virtual AccessibilityObject* selectedTabItem() { return 0; }    
504     virtual int layoutCount() const { return 0; }
505     virtual double estimatedLoadingProgress() const { return 0; }
506     static bool isARIAControl(AccessibilityRole);
507     static bool isARIAInput(AccessibilityRole);
508     virtual bool supportsARIAOwns() const { return false; }
509     virtual void ariaOwnsElements(AccessibilityChildrenVector&) const { }
510     virtual bool supportsARIAFlowTo() const { return false; }
511     virtual void ariaFlowToElements(AccessibilityChildrenVector&) const { }
512     virtual bool ariaHasPopup() const { return false; }
513     virtual bool ariaPressedIsPresent() const;
514     bool ariaIsMultiline() const;
515     virtual const AtomicString& invalidStatus() const;
516     bool supportsARIAExpanded() const;
517     AccessibilitySortDirection sortDirection() const;
518     virtual bool canvasHasFallbackContent() const { return false; }
519     bool supportsRangeValue() const;
520
521     bool supportsARIASetSize() const;
522     bool supportsARIAPosInSet() const;
523     int ariaSetSize() const;
524     int ariaPosInSet() const;
525     
526     // ARIA drag and drop
527     virtual bool supportsARIADropping() const { return false; }
528     virtual bool supportsARIADragging() const { return false; }
529     virtual bool isARIAGrabbed() { return false; }
530     virtual void setARIAGrabbed(bool) { }
531     virtual void determineARIADropEffects(Vector<String>&) { }
532     
533     // Called on the root AX object to return the deepest available element.
534     virtual AccessibilityObject* accessibilityHitTest(const IntPoint&) const { return 0; }
535     // Called on the AX object after the render tree determines which is the right AccessibilityRenderObject.
536     virtual AccessibilityObject* elementAccessibilityHitTest(const IntPoint&) const;
537
538     virtual AccessibilityObject* focusedUIElement() const;
539
540     virtual AccessibilityObject* firstChild() const { return 0; }
541     virtual AccessibilityObject* lastChild() const { return 0; }
542     virtual AccessibilityObject* previousSibling() const { return 0; }
543     virtual AccessibilityObject* nextSibling() const { return 0; }
544     virtual AccessibilityObject* parentObject() const = 0;
545     virtual AccessibilityObject* parentObjectUnignored() const;
546     virtual AccessibilityObject* parentObjectIfExists() const { return 0; }
547     static AccessibilityObject* firstAccessibleObjectFromNode(const Node*);
548     void findMatchingObjects(AccessibilitySearchCriteria*, AccessibilityChildrenVector&);
549
550     virtual AccessibilityObject* observableObject() const { return 0; }
551     virtual void linkedUIElements(AccessibilityChildrenVector&) const { }
552     virtual AccessibilityObject* titleUIElement() const { return 0; }
553     virtual bool exposesTitleUIElement() const { return true; }
554     virtual AccessibilityObject* correspondingLabelForControlElement() const { return 0; }
555     virtual AccessibilityObject* correspondingControlForLabelElement() const { return 0; }
556     virtual AccessibilityObject* scrollBar(AccessibilityOrientation) { return 0; }
557     
558     virtual AccessibilityRole ariaRoleAttribute() const { return UnknownRole; }
559     virtual bool isPresentationalChildOfAriaRole() const { return false; }
560     virtual bool ariaRoleHasPresentationalChildren() const { return false; }
561
562     // Accessibility Text
563     virtual void accessibilityText(Vector<AccessibilityText>&) { };
564
565     // A programmatic way to set a name on an AccessibleObject.
566     virtual void setAccessibleName(const AtomicString&) { }
567
568     // Accessibility Text - (To be deprecated).
569     virtual String accessibilityDescription() const { return String(); }
570     virtual String title() const { return String(); }
571     virtual String helpText() const { return String(); }
572
573     // Methods for determining accessibility text.
574     virtual String stringValue() const { return String(); }
575     virtual String textUnderElement() const { return String(); }
576     virtual String text() const { return String(); }
577     virtual int textLength() const { return 0; }
578     virtual String ariaLabeledByAttribute() const { return String(); }
579     virtual String ariaDescribedByAttribute() const { return String(); }
580     const AtomicString& placeholderValue() const;
581
582     // Only if isColorWell()
583     virtual void colorValue(int& r, int& g, int& b) const { r = 0; g = 0; b = 0; }
584
585     void setRoleValue(AccessibilityRole role) { m_role = role; }
586     virtual AccessibilityRole roleValue() const { return m_role; }
587
588     virtual AXObjectCache* axObjectCache() const;
589     AXID axObjectID() const { return m_id; }
590     
591     static AccessibilityObject* anchorElementForNode(Node*);
592     virtual Element* anchorElement() const { return 0; }
593     virtual Element* actionElement() const { return 0; }
594     virtual LayoutRect boundingBoxRect() const { return LayoutRect(); }
595     IntRect pixelSnappedBoundingBoxRect() const { return pixelSnappedIntRect(boundingBoxRect()); }
596     virtual LayoutRect elementRect() const = 0;
597     IntRect pixelSnappedElementRect() const { return pixelSnappedIntRect(elementRect()); }
598     LayoutSize size() const { return elementRect().size(); }
599     IntSize pixelSnappedSize() const { return elementRect().pixelSnappedSize(); }
600     virtual IntPoint clickPoint();
601     static IntRect boundingBoxForQuads(RenderObject*, const Vector<FloatQuad>&);
602     
603     TextIteratorBehavior textIteratorBehaviorForTextRange() const;
604     virtual PlainTextRange selectedTextRange() const { return PlainTextRange(); }
605     unsigned selectionStart() const { return selectedTextRange().start; }
606     unsigned selectionEnd() const { return selectedTextRange().length; }
607     
608     virtual KURL url() const { return KURL(); }
609     virtual VisibleSelection selection() const { return VisibleSelection(); }
610     virtual String selectedText() const { return String(); }
611     virtual const AtomicString& accessKey() const { return nullAtom; }
612     const String& actionVerb() const;
613     virtual Widget* widget() const { return 0; }
614     virtual Widget* widgetForAttachmentView() const { return 0; }
615     Page* page() const;
616     virtual Document* document() const;
617     virtual FrameView* topDocumentFrameView() const { return 0; }
618     virtual FrameView* documentFrameView() const;
619     String language() const;
620     // 1-based, to match the aria-level spec.
621     virtual unsigned hierarchicalLevel() const { return 0; }
622     
623     virtual void setFocused(bool) { }
624     virtual void setSelectedText(const String&) { }
625     virtual void setSelectedTextRange(const PlainTextRange&) { }
626     virtual void setValue(const String&) { }
627     virtual void setValue(float) { }
628     virtual void setSelected(bool) { }
629     virtual void setSelectedRows(AccessibilityChildrenVector&) { }
630     
631     virtual void makeRangeVisible(const PlainTextRange&) { }
632     virtual bool press() const;
633     bool performDefaultAction() const { return press(); }
634     
635     virtual AccessibilityOrientation orientation() const;
636     virtual void increment() { }
637     virtual void decrement() { }
638
639     virtual void childrenChanged() { }
640     virtual void textChanged() { }
641     virtual void updateAccessibilityRole() { }
642     const AccessibilityChildrenVector& children();
643     virtual void addChildren() { }
644     virtual void addChild(AccessibilityObject*) { }
645     virtual void insertChild(AccessibilityObject*, unsigned) { }
646     
647     virtual bool canHaveChildren() const { return true; }
648     virtual bool hasChildren() const { return m_haveChildren; }
649     virtual void updateChildrenIfNecessary();
650     virtual void setNeedsToUpdateChildren() { }
651     virtual void clearChildren();
652 #if PLATFORM(MAC)
653     virtual void detachFromParent();
654 #else
655     virtual void detachFromParent() { }
656 #endif
657
658     virtual void selectedChildren(AccessibilityChildrenVector&) { }
659     virtual void visibleChildren(AccessibilityChildrenVector&) { }
660     virtual void tabChildren(AccessibilityChildrenVector&) { }
661     virtual bool shouldFocusActiveDescendant() const { return false; }
662     virtual AccessibilityObject* activeDescendant() const { return 0; }    
663     virtual void handleActiveDescendantChanged() { }
664     virtual void handleAriaExpandedChanged() { }
665     bool isDescendantOfObject(const AccessibilityObject*) const;
666     bool isAncestorOfObject(const AccessibilityObject*) const;
667     AccessibilityObject* firstAnonymousBlockChild() const;
668     
669     static AccessibilityRole ariaRoleToWebCoreRole(const String&);
670     bool hasAttribute(const QualifiedName&) const;
671     const AtomicString& getAttribute(const QualifiedName&) const;
672
673     virtual VisiblePositionRange visiblePositionRange() const { return VisiblePositionRange(); }
674     virtual VisiblePositionRange visiblePositionRangeForLine(unsigned) const { return VisiblePositionRange(); }
675     
676     VisiblePositionRange visiblePositionRangeForUnorderedPositions(const VisiblePosition&, const VisiblePosition&) const;
677     VisiblePositionRange positionOfLeftWord(const VisiblePosition&) const;
678     VisiblePositionRange positionOfRightWord(const VisiblePosition&) const;
679     VisiblePositionRange leftLineVisiblePositionRange(const VisiblePosition&) const;
680     VisiblePositionRange rightLineVisiblePositionRange(const VisiblePosition&) const;
681     VisiblePositionRange sentenceForPosition(const VisiblePosition&) const;
682     VisiblePositionRange paragraphForPosition(const VisiblePosition&) const;
683     VisiblePositionRange styleRangeForPosition(const VisiblePosition&) const;
684     VisiblePositionRange visiblePositionRangeForRange(const PlainTextRange&) const;
685
686     String stringForVisiblePositionRange(const VisiblePositionRange&) const;
687     virtual IntRect boundsForVisiblePositionRange(const VisiblePositionRange&) const { return IntRect(); }
688     int lengthForVisiblePositionRange(const VisiblePositionRange&) const;
689     virtual void setSelectedVisiblePositionRange(const VisiblePositionRange&) const { }
690
691     virtual VisiblePosition visiblePositionForPoint(const IntPoint&) const { return VisiblePosition(); }
692     VisiblePosition nextVisiblePosition(const VisiblePosition& visiblePos) const { return visiblePos.next(); }
693     VisiblePosition previousVisiblePosition(const VisiblePosition& visiblePos) const { return visiblePos.previous(); }
694     VisiblePosition nextWordEnd(const VisiblePosition&) const;
695     VisiblePosition previousWordStart(const VisiblePosition&) const;
696     VisiblePosition nextLineEndPosition(const VisiblePosition&) const;
697     VisiblePosition previousLineStartPosition(const VisiblePosition&) const;
698     VisiblePosition nextSentenceEndPosition(const VisiblePosition&) const;
699     VisiblePosition previousSentenceStartPosition(const VisiblePosition&) const;
700     VisiblePosition nextParagraphEndPosition(const VisiblePosition&) const;
701     VisiblePosition previousParagraphStartPosition(const VisiblePosition&) const;
702     virtual VisiblePosition visiblePositionForIndex(unsigned, bool /*lastIndexOK */) const { return VisiblePosition(); }
703     
704     virtual VisiblePosition visiblePositionForIndex(int) const { return VisiblePosition(); }
705     virtual int indexForVisiblePosition(const VisiblePosition&) const { return 0; }
706
707     AccessibilityObject* accessibilityObjectForPosition(const VisiblePosition&) const;
708     int lineForPosition(const VisiblePosition&) const;
709     PlainTextRange plainTextRangeForVisiblePositionRange(const VisiblePositionRange&) const;
710     virtual int index(const VisiblePosition&) const { return -1; }
711
712     virtual void lineBreaks(Vector<int>&) const { }
713     virtual PlainTextRange doAXRangeForLine(unsigned) const { return PlainTextRange(); }
714     PlainTextRange doAXRangeForPosition(const IntPoint&) const;
715     virtual PlainTextRange doAXRangeForIndex(unsigned) const { return PlainTextRange(); }
716     PlainTextRange doAXStyleRangeForIndex(unsigned) const;
717
718     virtual String doAXStringForRange(const PlainTextRange&) const { return String(); }
719     virtual IntRect doAXBoundsForRange(const PlainTextRange&) const { return IntRect(); }
720     String listMarkerTextForNodeAndPosition(Node*, const VisiblePosition&) const;
721
722     unsigned doAXLineForIndex(unsigned);
723
724     virtual String stringValueForMSAA() const { return String(); }
725     virtual String stringRoleForMSAA() const { return String(); }
726     virtual String nameForMSAA() const { return String(); }
727     virtual String descriptionForMSAA() const { return String(); }
728     virtual AccessibilityRole roleValueForMSAA() const { return roleValue(); }
729
730     virtual String passwordFieldValue() const { return String(); }
731
732     // Used by an ARIA tree to get all its rows.
733     void ariaTreeRows(AccessibilityChildrenVector&);
734     // Used by an ARIA tree item to get all of its direct rows that it can disclose.
735     void ariaTreeItemDisclosedRows(AccessibilityChildrenVector&);
736     // Used by an ARIA tree item to get only its content, and not its child tree items and groups. 
737     void ariaTreeItemContent(AccessibilityChildrenVector&);
738     
739     // ARIA live-region features.
740     bool supportsARIALiveRegion() const;
741     bool isInsideARIALiveRegion() const;
742     virtual const AtomicString& ariaLiveRegionStatus() const { return nullAtom; }
743     virtual const AtomicString& ariaLiveRegionRelevant() const { return nullAtom; }
744     virtual bool ariaLiveRegionAtomic() const { return false; }
745     virtual bool ariaLiveRegionBusy() const { return false; }
746     
747     bool supportsARIAAttributes() const;
748     
749     // CSS3 Speech properties.
750     virtual ESpeak speakProperty() const { return SpeakNormal; }
751
752     // Make this object visible by scrolling as many nested scrollable views as needed.
753     virtual void scrollToMakeVisible() const;
754     // Same, but if the whole object can't be made visible, try for this subrect, in local coordinates.
755     virtual void scrollToMakeVisibleWithSubFocus(const IntRect&) const;
756     // Scroll this object to a given point in global coordinates of the top-level window.
757     virtual void scrollToGlobalPoint(const IntPoint&) const;
758
759     bool lastKnownIsIgnoredValue();
760     void setLastKnownIsIgnoredValue(bool);
761
762     // Fires a children changed notification on the parent if the isIgnored value changed.
763     void notifyIfIgnoredValueChanged();
764
765     // All math elements return true for isMathElement().
766     virtual bool isMathElement() const { return false; }
767     virtual bool isMathFraction() const { return false; }
768     virtual bool isMathFenced() const { return false; }
769     virtual bool isMathSubscriptSuperscript() const { return false; }
770     virtual bool isMathRow() const { return false; }
771     virtual bool isMathUnderOver() const { return false; }
772     virtual bool isMathRoot() const { return false; }
773     virtual bool isMathSquareRoot() const { return false; }
774     virtual bool isMathText() const { return false; }
775     virtual bool isMathNumber() const { return false; }
776     virtual bool isMathOperator() const { return false; }
777     virtual bool isMathFenceOperator() const { return false; }
778     virtual bool isMathSeparatorOperator() const { return false; }
779     virtual bool isMathIdentifier() const { return false; }
780     virtual bool isMathTable() const { return false; }
781     virtual bool isMathTableRow() const { return false; }
782     virtual bool isMathTableCell() const { return false; }
783     
784     // Root components.
785     virtual AccessibilityObject* mathRadicandObject() { return 0; }
786     virtual AccessibilityObject* mathRootIndexObject() { return 0; }
787     
788     // Under over components.
789     virtual AccessibilityObject* mathUnderObject() { return 0; }
790     virtual AccessibilityObject* mathOverObject() { return 0; }
791
792     // Fraction components.
793     virtual AccessibilityObject* mathNumeratorObject() { return 0; }
794     virtual AccessibilityObject* mathDenominatorObject() { return 0; }
795
796     // Subscript/superscript components.
797     virtual AccessibilityObject* mathBaseObject() { return 0; }
798     virtual AccessibilityObject* mathSubscriptObject() { return 0; }
799     virtual AccessibilityObject* mathSuperscriptObject() { return 0; }
800     
801     // Fenced components.
802     virtual String mathFencedOpenString() const { return String(); }
803     virtual String mathFencedCloseString() const { return String(); }
804     
805 #if HAVE(ACCESSIBILITY)
806 #if PLATFORM(GTK) || PLATFORM(EFL)
807     AccessibilityObjectWrapper* wrapper() const;
808     void setWrapper(AccessibilityObjectWrapper*);
809 #elif !PLATFORM(CHROMIUM)
810     AccessibilityObjectWrapper* wrapper() const { return m_wrapper.get(); }
811     void setWrapper(AccessibilityObjectWrapper* wrapper) 
812     {
813         m_wrapper = wrapper;
814     }
815 #endif
816 #endif
817     
818 #if PLATFORM(MAC)
819     void overrideAttachmentParent(AccessibilityObject* parent);
820 #else
821     void overrideAttachmentParent(AccessibilityObject*) { }
822 #endif
823     
824 #if HAVE(ACCESSIBILITY)
825     // a platform-specific method for determining if an attachment is ignored
826     bool accessibilityIgnoreAttachment() const;
827     // gives platforms the opportunity to indicate if and how an object should be included
828     AccessibilityObjectInclusion accessibilityPlatformIncludesObject() const;
829 #else
830     bool accessibilityIgnoreAttachment() const { return true; }
831     AccessibilityObjectInclusion accessibilityPlatformIncludesObject() const { return DefaultBehavior; }
832 #endif
833
834     // allows for an AccessibilityObject to update its render tree or perform
835     // other operations update type operations
836     void updateBackingStore();
837     
838 protected:
839     AXID m_id;
840     AccessibilityChildrenVector m_children;
841     mutable bool m_haveChildren;
842     AccessibilityRole m_role;
843     AccessibilityObjectInclusion m_lastKnownIsIgnoredValue;
844
845     virtual bool computeAccessibilityIsIgnored() const { return true; }
846
847     // If this object itself scrolls, return its ScrollableArea.
848     virtual ScrollableArea* getScrollableAreaIfScrollable() const { return 0; }
849     virtual void scrollTo(const IntPoint&) const { }
850
851     static bool isAccessibilityObjectSearchMatch(AccessibilityObject*, AccessibilitySearchCriteria*);
852     static bool isAccessibilityTextSearchMatch(AccessibilityObject*, AccessibilitySearchCriteria*);
853     static bool objectMatchesSearchCriteriaWithResultLimit(AccessibilityObject*, AccessibilitySearchCriteria*, AccessibilityChildrenVector&);
854     virtual AccessibilityRole buttonRoleType() const;
855     bool ariaIsHidden() const;
856
857 #if PLATFORM(GTK) || (PLATFORM(EFL) && HAVE(ACCESSIBILITY))
858     bool allowsTextRanges() const;
859     unsigned getLengthForTextRange() const;
860 #else
861     bool allowsTextRanges() const { return isTextControl(); }
862     unsigned getLengthForTextRange() const { return text().length(); }
863 #endif
864
865 #if PLATFORM(MAC)
866     RetainPtr<WebAccessibilityObjectWrapper> m_wrapper;
867 #elif PLATFORM(WIN) && !OS(WINCE)
868     COMPtr<AccessibilityObjectWrapper> m_wrapper;
869 #elif PLATFORM(GTK) || (PLATFORM(EFL) && HAVE(ACCESSIBILITY))
870     AtkObject* m_wrapper;
871 #elif PLATFORM(CHROMIUM)
872     bool m_detached;
873 #endif
874 };
875
876 #if !HAVE(ACCESSIBILITY)
877 inline const AccessibilityObject::AccessibilityChildrenVector& AccessibilityObject::children() { return m_children; }
878 inline const String& AccessibilityObject::actionVerb() const { return emptyString(); }
879 inline int AccessibilityObject::lineForPosition(const VisiblePosition&) const { return -1; }
880 inline void AccessibilityObject::updateBackingStore() { }
881 #endif
882
883 } // namespace WebCore
884
885 #endif // AccessibilityObject_h