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